|
| 1 | +--- |
| 2 | +layout: post |
| 3 | +title: "Announcing Full Schema Creation: Provision complete tables in one atomic call" |
| 4 | +description: Create a table, all its columns, and indexes synchronously, ready to use instantly, with no background jobs. |
| 5 | +date: 2025-12-30 |
| 6 | +cover: /images/blog/full-schema.png |
| 7 | +timeToRead: 5 |
| 8 | +author: aditya-oberai |
| 9 | +category: announcement |
| 10 | +featured: false |
| 11 | +callToAction: true |
| 12 | +--- |
| 13 | + |
| 14 | +When you’re spinning up a new feature, environment, or test pipeline, schema creation shouldn’t be the slowest or most fragile step in your workflow. Yet traditionally, creating a usable table meant orchestrating multiple calls, waiting on async jobs, and hoping nothing failed halfway through. |
| 15 | + |
| 16 | +That’s exactly why we’re announcing **Full Schema Creation** for Appwrite Databases. |
| 17 | + |
| 18 | +With Full Schema Creation, you can define an entire table, its attributes and indexes, in a **single, synchronous request**. When the call returns, the table is immediately ready for reads and writes. If anything fails along the way, nothing is created. No partial schemas. No waiting. No brittle setup scripts. |
| 19 | + |
| 20 | +# One request. One outcome. Fully usable. |
| 21 | + |
| 22 | +Previously, schema provisioning looked something like this: |
| 23 | + |
| 24 | +1. Create a table |
| 25 | +2. Create column |
| 26 | +3. Wait for async column jobs to complete |
| 27 | +4. Create indexes |
| 28 | +5. Wait again |
| 29 | +6. Finally, the table might be usable |
| 30 | + |
| 31 | +This step-wise flow introduced delays, race conditions in automation scripts, and fragile deploys, especially in CI/CD, preview environments, and migrations. |
| 32 | + |
| 33 | +With Full Schema Creation, all of that collapses into a single operation. You define everything upfront, Appwrite validates it all together, and either the entire schema is created successfully, or nothing is. |
| 34 | + |
| 35 | +```js |
| 36 | +const table = await tablesDB.createTable({ |
| 37 | + databaseId: 'contacts_db', |
| 38 | + tableId: 'contacts', |
| 39 | + name: 'Contacts', |
| 40 | + columns: [ |
| 41 | + { |
| 42 | + key: 'email', |
| 43 | + type: 'email', |
| 44 | + required: true |
| 45 | + }, |
| 46 | + { |
| 47 | + key: 'name', |
| 48 | + type: 'string', |
| 49 | + size: 255, |
| 50 | + required: true |
| 51 | + }, |
| 52 | + { |
| 53 | + key: 'is_active', |
| 54 | + type: 'boolean', |
| 55 | + required: true |
| 56 | + }, |
| 57 | + ], |
| 58 | + indexes: [ |
| 59 | + { |
| 60 | + key: 'idx_email', |
| 61 | + type: 'unique', |
| 62 | + attributes: ['email'] |
| 63 | + } |
| 64 | + ] |
| 65 | +}); |
| 66 | +``` |
| 67 | + |
| 68 | +# How it works |
| 69 | + |
| 70 | +Full Schema Creation introduces an atomic, synchronous way to provision database schemas. Here’s what happens under the hood: |
| 71 | + |
| 72 | +- **Define the full schema in one call** |
| 73 | + |
| 74 | + In a single API request, you define: |
| 75 | + |
| 76 | + - The table |
| 77 | + - All columns (type, length, nullability, defaults, enums, relationships) |
| 78 | + - All indexes |
| 79 | + |
| 80 | +- **Synchronous apply** |
| 81 | + |
| 82 | + Appwrite applies the schema immediately. The request only returns once the table is fully created and ready to read and write, without any background jobs, polling, or delays. |
| 83 | + |
| 84 | +- **Atomic guarantees** |
| 85 | + |
| 86 | + If any part of the schema fails validation, an invalid column, a conflicting index, or a broken relationship reference, the entire operation is rolled back. You’ll never end up with a half-created table. |
| 87 | + |
| 88 | +This makes schema creation deterministic, predictable, and safe, making it ideal for automation-heavy workflows and rapid iteration. |
| 89 | + |
| 90 | +# What this unlocks for you |
| 91 | + |
| 92 | +- **One-shot setup:** Define a complete table in a single, atomic call. |
| 93 | +- **No async waiting:** The table is usable as soon as the API responds. |
| 94 | +- **Fewer moving parts:** Less orchestration means fewer retries and fewer failures. |
| 95 | +- **Deterministic CI/CD:** Reliable schema bootstrapping for tests, previews, and pipelines. |
| 96 | +- **Instant readiness:** Seed data and run integration tests immediately after creation. |
| 97 | + |
| 98 | +# Built for teams that move fast |
| 99 | + |
| 100 | +Full Schema Creation was designed with: |
| 101 | + |
| 102 | +- Backend and platform engineers |
| 103 | +- CI/CD pipelines and test environments |
| 104 | +- Agencies and partners are shipping reusable templates |
| 105 | +- Teams are spinning up many short-lived environments |
| 106 | + |
| 107 | +If your workflow depends on fast and repeatable schema provisioning, this feature eliminates an entire class of setup problems. |
| 108 | + |
| 109 | +## Why this matters for Appwrite |
| 110 | + |
| 111 | +From our side, Full Schema Creation significantly reduces time-to-first-write, helping users activate faster and ship sooner. It also eliminates a common source of schema-related support issues by making database setup simpler, safer, and more predictable. |
| 112 | + |
| 113 | +# Familiar, but better |
| 114 | + |
| 115 | +If this sounds familiar, that’s because similar ideas exist elsewhere: |
| 116 | + |
| 117 | +- SQL databases with `CREATE TABLE` + `CREATE INDEX` in one statement |
| 118 | +- Prisma or Drizzle migrations |
| 119 | +- Hasura metadata applies |
| 120 | + |
| 121 | +What’s different is bringing this experience directly into a BaaS environment—where schema creation has historically been UI-driven or step-wise and async. |
| 122 | + |
| 123 | +# Get started |
| 124 | + |
| 125 | +Full Schema Create is available on **Appwrite Cloud** today and supported on **self-hosted deployments.** |
| 126 | + |
| 127 | +You can now provision complete, production-ready tables in one call, whether you’re bootstrapping a new feature, running CI pipelines, or spinning up preview environments. |
| 128 | + |
| 129 | +No more waiting. No more partial schemas. Just clean, atomic, ready-to-use tables from the moment you create them. |
| 130 | + |
| 131 | +# More resources |
| 132 | + |
| 133 | +- [Announcing API for spatial columns: Build scalable location-aware apps with ease](/blog/post/announcing-spatial-columns) |
| 134 | +- [Announcing an improved Appwrite Databases experience. A completely new look and feel](/blog/post/announcing-appwrite-databases-new-ui) |
| 135 | +- [Announcing Atomic numeric operations: Safe, server-side increments and decrements](/blog/post/announcing-atomic-numeric-operations) |
0 commit comments