Home/Blog/Airtable to PostgreSQL Migration: IDs, Links and Files
Data migration

Airtable to PostgreSQL migration: preserve records, links and files

Plan an Airtable to PostgreSQL migration with complete table exports, stable record IDs, relationship mapping, attachment capture and cutover checks.

Remqa · November 14, 2026 · 5 min read

Short answer

To migrate Airtable to PostgreSQL, inventory every table and workflow, export unfiltered views with the required fields, preserve record identity and rebuild relationships in a tested target schema. Download attachment files separately, validate the imported data and replace the application workflows before switching writers. CSV export alone is not a complete base migration.

  • Airtable CSV exports are per table and include visible field values from the chosen view
  • Record-level comments and field descriptions are outside the CSV export
  • Preserve stable record IDs and explicit relationship pairs instead of joining on labels
  • Attachment URLs in CSV exports expire, so copy and verify the actual files

Your Airtable export opens correctly in a spreadsheet. The row count looks plausible. Then a project in the new application has the wrong client, an attachment link stops working and an approval form still writes to the old base. Those failures have different causes. A reliable Airtable to PostgreSQL migration needs separate plans for records, relationships, files and application behavior.

The process below uses Airtable's documented export behavior and PostgreSQL 17 import semantics. The staging layout, relationship mapping and cutover checks are recommended engineering design. They are not a claim that either product automatically migrates the whole application for you.

Inventory the base before exporting

List every table, field, linked relationship and active workflow. Record who uses each view, which forms create records and which integrations update them. Include interfaces, automations and any reporting process that depends on calculated values. Give every retained behavior an owner and a target implementation.

Keep the data inventory separate from the workflow inventory. A table of projects might move cleanly while its approval process remains undocumented. Decide which behaviors will be rebuilt, retained temporarily or intentionally retired. The migration is incomplete until operators can perform the agreed work without accidental writes to the old system.

Export a complete view of each table

Airtable's ordinary CSV export is per table through a grid view on the web or desktop application. There is no ordinary full-base download as a single file. To capture all records in a table, export a view without filters. Make every required field visible because the export includes the field values visible in the view.

Create a migration manifest that records the table, chosen view, export time, expected row count and included fields. Retain the original files without editing them. Do not casually open and resave the only copy in a spreadsheet, where values may be reformatted before the import team sees them.

Source itemExport boundaryMigration action
Table recordsChosen view and visible fieldsUse unfiltered views and a field checklist
Comments and descriptionsNot included in CSV exportAgree a separate archive or exclusion
Attachment fieldsFilenames and temporary URLsCopy actual files and verify access
Application behaviorCSV is a data fileRebuild and test the agreed workflows

Airtable also excludes base guide content and data stored solely in extensions from CSV exports. Treat those exclusions as scope decisions. If an operator needs comments to understand a customer commitment, a table-only migration does not meet that need. Do not quietly redefine missing history as unnecessary.

Preserve identity before rebuilding links

Airtable provides the RECORD_ID() formula to return a record's unique identifier. Preserve that identifier in your extraction design, together with the base and table context. If adding a formula field is the chosen route, have an authorized owner approve the source change and include the field in the export view.

Keep a mapping from source identity to target identity. Names are useful for review but poor migration keys. Two clients can have the same name, and a project's display label can change. Reject ambiguous matches rather than linking to the first matching label.

Airtable linked records represent relationships between specific records and mirror that association in the linked table. A lookup can display information from the related record. In PostgreSQL, model each relationship deliberately. A many-to-many relationship usually needs a separate relationship table in the target design. Do not confuse a displayed lookup value with the relationship itself.

Require explicit source-to-target relationship evidence. If the chosen CSV extraction does not provide reliable identifiers for both sides of a link, improve the extraction before loading relationships. Do not guess from a comma-separated list of names.

Capture attachment bytes, not just URLs

Airtable documents that attachment fields in CSV exports contain filenames and URLs. Those export URLs expire after a few hours. A saved CSV is therefore not a durable copy of its attachments. Schedule file capture as part of the extraction, not as cleanup after the database move.

For each file, retain the source record reference, original filename, captured storage location and verification result. Use checksums to compare downloaded bytes with the files you place in target storage. Keep failed downloads in an exception list. Test retrieval through the new application's permissions, not only through an administrator's storage console.

Load raw data into staging first

Create PostgreSQL staging tables before import. COPY loads into an existing table and maps input fields in order to an explicit column list. HEADER true skips the input header. It does not map arbitrary field names for you. Choose the file encoding explicitly and verify column order against the manifest.

For files on an operator's computer, psql's client-side copy facility reads from the client. A server-side COPY filename is interpreted from the database server's perspective. Choose a supported route for your environment instead of granting broad server file privileges just to load a local export.

Test blank values carefully. In PostgreSQL CSV mode, the default interpretation distinguishes an unquoted empty field as null from a quoted empty string. Inspect the actual Airtable output and agree the target meaning per field. Test embedded commas, quotes and line breaks with a real CSV parser.

Convert fields and validate meaning

Transform staging data into the agreed application tables with explicit rules for dates, numbers, selections and missing values. Keep rejected conversions tied to their source identity. PostgreSQL COPY invokes destination triggers and check constraints, so know which behavior will run before loading application tables.

Document whether a computed source value becomes a stored historical value, a target calculation or an application rule. Compare representative outputs with the source. Loading a displayed total does not define how that total should change when a user edits a related record later.

Validate row counts by table, unique source mappings, relationship pairs and attachment coverage. Then have operators check complete workflows. Open a client, inspect related projects, retrieve a file and submit a test update. Record each unexplained difference before approving cutover.

Plan the final change window

Do not assume LAST_MODIFIED_TIME() captures every dependency change. Airtable says automatic changes in computed fields are not directly reflected, and updates to fields inside a linked record do not change the referencing record's timestamp. Deletions also need an explicit reconciliation strategy in your migration design.

Choose a controlled write freeze or a change-capture design that covers the required scope. Reconcile the final dataset, switch forms and integrations, and monitor which system receives new writes. Retain a rollback plan that accounts for changes made after the switch. Avoid two active writers without a tested conflict policy.

How Remqa approaches Airtable migrations

Remqa's data migration work covers source inventory, mapping, test loads and operator validation. For Airtable, the scope should explicitly include relationships, files and the workflows behind the grid. Agree those boundaries before choosing an import tool.

Our Excel to PostgreSQL guide covers related CSV planning. Bring a base inventory and one representative workflow to a migration discussion. The useful first deliverable is a testable mapping and exception list, not a promise that a CSV replaces the application.

FAQ

Questions people ask.

Can I export an entire Airtable base as one CSV?

Airtable does not support a full-base export as one file through its ordinary CSV workflow. Export each table separately. Use unfiltered views and show all required fields, then inventory items outside those files.

Does an Airtable CSV contain attachment files?

No. Airtable documents attachment fields in CSV exports as filenames and URLs. Those URLs expire after a few hours. Download the actual files separately and verify them before relying on the export.

How do I preserve Airtable record identity?

Airtable provides RECORD_ID() to return the unique record identifier. Preserve the base and table context alongside that ID in a migration mapping, rather than using a display name as the identity.

Can PostgreSQL COPY recreate an Airtable application?

No. COPY loads data into an existing table. It does not recreate forms, interfaces, automations, field formulas or application permissions. Define and test those replacements as separate migration work.

Is LAST_MODIFIED_TIME() enough for a complete delta migration?

Do not assume it is. Airtable documents that automatic computed-field changes are not reflected directly, and edits inside linked records do not change the referencing record timestamp. Account for dependency changes and deletions explicitly.

Talk to an engineer

Want an engineer to look at your setup?

Book a free 30-minute call. We look at your tools and your team's week and tell you what we would do first.

Book a free 30-minute call
30 minutesFree, with an engineer
Your stackWe look at what you run today
Straight answerIncluding when we're not the fit