如何将本地SQLite数据库与Heroku上的Postgres数据库双向同步?
嘿,这个问题我之前帮朋友处理过,核心就是搞定SQLite和PostgreSQL之间的数据迁移,还要搭好日常双向同步的工作流。下面一步步来,保证你能搞定:
一、先把本地SQLite数据推送到Heroku Postgres
这一步是解决你现在远程没有本地数据的问题:
导出本地SQLite数据
打开终端,运行命令把本地数据库的结构和数据全部导出成SQL文件:sqlite3 db.sqlite3 .dump > local_data.sql注意把
db.sqlite3换成你本地项目里实际的数据库文件名,导出的local_data.sql会保存在当前目录。适配PostgreSQL语法
SQLite和Postgres的语法有一些差异,手动修改SQL文件里的关键部分即可(数据量小的话很方便):- 把SQLite的
AUTOINCREMENT替换成Postgres的GENERATED ALWAYS AS IDENTITY - 把布尔值的
0/1改成false/true - 若用到
datetime('now'),替换成Postgres的CURRENT_TIMESTAMP
如果数据量大,推荐用pgloader工具自动处理语法转换,省不少事。
- 把SQLite的
导入到Heroku Postgres
- 先获取Heroku数据库的连接地址:
复制返回的类似heroku config:get DATABASE_URLpostgres://user:pass@host:port/dbname的链接。 - 直接导入SQL文件:
或者用Heroku内置命令进入数据库终端后导入:psql <刚才复制的DATABASE_URL> < local_data.sqlheroku pg:psql # 进入终端后执行 \i local_data.sql - 导入完成后可以验证,比如查询用户表:
SELECT * FROM auth_user;,确认本地数据已同步到远程。
- 先获取Heroku数据库的连接地址:
二、把Heroku Postgres数据拉取到本地SQLite
要把远程的更新同步回本地,用Heroku官方提供的命令就很简单:
heroku pg:pull DATABASE_URL local_db.sqlite3
这里的local_db.sqlite3是你本地要生成的数据库文件名,如果原来有同名文件会被覆盖,记得先备份本地原有数据库。执行完启动本地服务器,就能看到远程的数据了。
三、建立日常双向同步的工作流
为了避免每次手动折腾,给你整理一套日常开发的流程:
- 开始本地开发前:先拉取远程最新数据,确保本地数据库和远程一致:
heroku pg:pull DATABASE_URL db.sqlite3 - 本地开发完成,准备部署到Heroku时:
- 先备份本地数据,以防迁移出问题:
sqlite3 db.sqlite3 .dump > backup_local_$(date +%Y%m%d).sql - 把本地数据推送到远程(推荐用
pgloader自动处理语法):pgloader sqlite:///path/to/your/db.sqlite3 postgresql://<DATABASE_URL> - 正常提交代码部署:
git add . && git commit -m "update features and sync data" && git push heroku main
- 先备份本地数据,以防迁移出问题:
四、关键注意事项
- 继续保持
*.sqlite3在.gitignore里,绝对不要提交到Git!本地数据库属于个人开发环境,远程用的是Postgres,提交这个文件只会搞乱团队环境。 - 每次迁移数据前一定要备份:远程可以用
heroku pg:backups:capture创建备份,本地直接复制sqlite文件到其他文件夹即可。 - 若遇到导入报错,优先排查语法差异,比如字段类型、约束写法的不同,慢慢调整就能解决。
内容的提问来源于stack exchange,提问作者Wizard
相关产品推荐
相关产品推荐

