如何在Django中从本地SQLite数据库迁移至PostgreSQL?
SQLite3 迁移至 PostgreSQL 的可行方案(含Django方法修复)
一、修复你尝试的Django导出数据问题
你当前的Django操作未导出数据,大概率是以下环节出现问题,按步骤修正即可:
将app加入INSTALLED_APPS
在项目的settings.py中,把你的app添加到INSTALLED_APPS列表:INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'app', # 新增此行 ]正确放置models文件
用inspectdb > models.py生成的文件需要替换app目录下的原models.py,而非放在项目根目录。验证连接并导出数据
先确认Django能读取SQLite数据:python manage.py shell在shell中测试查询(替换
YourModelName为实际表名):from app.models import YourModelName print(YourModelName.objects.all())若能查到数据,执行导出命令(建议指定全量导出):
python manage.py dumpdata --all > data.json导入至PostgreSQL
修改settings.py的数据库配置为PostgreSQL:DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql', 'NAME': '你的PG数据库名', 'USER': '你的PG用户名', 'PASSWORD': '你的PG密码', 'HOST': 'localhost', 'PORT': '5432', } }先创建表结构:
python manage.py migrate再导入数据:
python manage.py loaddata data.json
二、其他可行迁移方案
方案1:SQLite导出SQL后转换为PG兼容语法
- 导出SQLite原始SQL
在Windows命令提示符或Linux终端执行:sqlite3 xxxxx.db .dump > sqlite_dump.sql - 修正语法差异
手动或用工具调整SQL:- 替换
AUTOINCREMENT为GENERATED AS IDENTITY(PG 10+推荐) - 替换SQLite的
TEXT为VARCHAR或保留TEXT(PG兼容) - 移除SQLite特有的冗余语法(如部分
TRANSACTION语句) - 将
datetime类型改为PG的TIMESTAMP
- 替换
- 导入至PG
psql -U 你的PG用户名 -d 你的PG数据库名 -f sqlite_dump.sql
方案2:Python脚本直接迁移(灵活可控)
用Python连接两个数据库,直接读写数据,适合自定义迁移逻辑:
- 安装依赖
pip install psycopg2-binary - 编写迁移脚本
注:需根据实际表结构调整类型转换逻辑(如处理import sqlite3 import psycopg2 from psycopg2 import sql # 连接SQLite sqlite_conn = sqlite3.connect('xxxxx.db') sqlite_cursor = sqlite_conn.cursor() # 连接PostgreSQL pg_conn = psycopg2.connect( dbname='你的PG数据库名', user='你的PG用户名', password='你的PG密码', host='localhost', port='5432' ) pg_cursor = pg_conn.cursor() # 获取所有非系统表 sqlite_cursor.execute("SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%';") tables = [row[0] for row in sqlite_cursor.fetchall()] for table in tables: # 获取表字段 sqlite_cursor.execute(f"PRAGMA table_info({table});") columns = [row[1] for row in sqlite_cursor.fetchall()] col_identifiers = [sql.Identifier(col) for col in columns] # 读取SQLite建表语句并转换为PG兼容格式 sqlite_cursor.execute(f"SELECT sql FROM sqlite_master WHERE type='table' AND name='{table}';") create_sql = sqlite_cursor.fetchone()[0] create_sql = create_sql.replace('AUTOINCREMENT', 'GENERATED AS IDENTITY') create_sql = create_sql.replace('INTEGER PRIMARY KEY', 'INTEGER PRIMARY KEY GENERATED ALWAYS AS IDENTITY') try: pg_cursor.execute(create_sql) except Exception as e: print(f"创建表{table}失败: {e}") continue # 批量插入数据 sqlite_cursor.execute(f"SELECT {', '.join(columns)} FROM {table};") rows = sqlite_cursor.fetchall() insert_sql = sql.SQL(f"INSERT INTO {sql.Identifier(table)} ({sql.SQL(', ').join(col_identifiers)}) VALUES ({', '.join(['%s']*len(columns))})") pg_cursor.executemany(insert_sql, rows) # 提交并关闭连接 pg_conn.commit() sqlite_conn.close() pg_conn.close()BOOLEAN、BLOB等)。
方案3:使用Ora2Pg迁移工具(Linux环境)
Ora2Pg原本用于Oracle到PG迁移,也支持SQLite:
- 安装工具
sudo apt-get install ora2pg - 配置迁移文件
创建ora2pg.conf:SOURCE_TYPE = SQLite SOURCE = xxxxx.db TARGET = PostgreSQL OUTPUT = pg_dump.sql - 生成PG兼容SQL
ora2pg -c ora2pg.conf - 导入至PG
同方案1的导入步骤。
内容的提问来源于stack exchange,提问作者Anarcheese
相关产品推荐
相关产品推荐

