*.sqlite, *.db, or a path you configure in DB_DATABASE), any changes are lost whenever your application is redeployed, hibernates and wakes, or is moved between hosts.
Migrating from SQLite to PostgreSQL or MySQL
When you deploy to Laravel Cloud, you need a hosted database such as Laravel Serverless Postgres (Neon) or Laravel MySQL. If your app currently uses SQLite, migrate your schema and data using one of the paths below.SQLite to PostgreSQL (Neon)
Export your SQLite data
If you plan to load the
.db file with pgloader in the import step below, skip this step and the cleanup step. Otherwise, from your project directory, dump the database to SQL:Clean up the dump
PostgreSQL uses different syntax than SQLite. You only need this step if you import with
psql using a hand-edited dump.sql (if you use pgloader with the .db file directly, skip this step). Edit dump.sql as needed:- Remove or replace
BEGIN TRANSACTIONandCOMMIT. - Replace
INTEGER PRIMARY KEY AUTOINCREMENTwithSERIAL PRIMARY KEYorBIGSERIAL PRIMARY KEY. - Replace
BLOBwithBYTEA. - Remove all
PRAGMAstatements. - Replace
TEXTcolumns that store dates withTIMESTAMPif you want PostgreSQL-native date handling. - Strip any
OWNER TOorGRANTstatements that reference system roles; Neon does not support superuser operations.
Import with pgloader or psql
pgloader can load a SQLite file directly into Postgres. Check pgloader’s release notes for PostgreSQL 18 compatibility before you proceed. If it supports your target version, run (substitute the full path to your SQLite file; see pgloader’s SQLite reference for URI forms):
sslmode=require is mandatory for Neon.If pgloader does not yet support PostgreSQL 18, finish cleaning dump.sql manually and import with psql:SQLite to MySQL 8.4
Clean up the dump
Edit
dump.sql for MySQL compatibility:- Translate SQLite’s
INTEGER PRIMARY KEY AUTOINCREMENTpattern into a MySQL integer primary key column that usesAUTO_INCREMENT. - Replace
TEXTwithLONGTEXTorVARCHAR(n)as appropriate for your columns. - Remove all
PRAGMAstatements. - Change double-quoted identifiers (for example,
"column") to backticks (for example,`column`). - Replace
BEGIN TRANSACTIONwithSTART TRANSACTION. - Keep
BLOBasBLOB. - Booleans: SQLite stores booleans as
0/1integers; MySQL’sTINYINT(1)behaves the same way. utf8mb4is the default character set for new databases on MySQL 8.4 in most configurations, so you often do not need to set it explicitly.
Before you go live
- Run through the migration on a staging environment first.
- For MySQL, the
sqlite3-to-mysqlpackage (pip install sqlite3-to-mysql) can automate dialect conversion instead of editingdump.sqlby hand. - SQLite is permissive about types; PostgreSQL and MySQL are stricter, so invalid data may only surface after you migrate.
- Foreign keys are not always enforced in SQLite (for example, when
PRAGMA foreign_keysis off). Your target database will enforce them, which can reveal existing data integrity problems.

