You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Django中从本地SQLite数据库迁移至PostgreSQL?

SQLite3 迁移至 PostgreSQL 的可行方案(含Django方法修复)

一、修复你尝试的Django导出数据问题

你当前的Django操作未导出数据,大概率是以下环节出现问题,按步骤修正即可:

  1. 将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',  # 新增此行
    ]
    
  2. 正确放置models文件
    用inspectdb > models.py生成的文件需要替换app目录下的原models.py,而非放在项目根目录。

  3. 验证连接并导出数据
    先确认Django能读取SQLite数据:

    python manage.py shell
    

    在shell中测试查询(替换YourModelName为实际表名):

    from app.models import YourModelName
    print(YourModelName.objects.all())
    

    若能查到数据,执行导出命令(建议指定全量导出):

    python manage.py dumpdata --all > data.json
    
  4. 导入至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兼容语法

  1. 导出SQLite原始SQL
    在Windows命令提示符或Linux终端执行:
    sqlite3 xxxxx.db .dump > sqlite_dump.sql
    
  2. 修正语法差异
    手动或用工具调整SQL:
    • 替换AUTOINCREMENT为GENERATED AS IDENTITY(PG 10+推荐)
    • 替换SQLite的TEXT为VARCHAR或保留TEXT(PG兼容)
    • 移除SQLite特有的冗余语法(如部分TRANSACTION语句)
    • 将datetime类型改为PG的TIMESTAMP
  3. 导入至PG
    psql -U 你的PG用户名 -d 你的PG数据库名 -f sqlite_dump.sql
    

方案2:Python脚本直接迁移(灵活可控)

用Python连接两个数据库,直接读写数据,适合自定义迁移逻辑:

  1. 安装依赖
    pip install psycopg2-binary
    
  2. 编写迁移脚本
    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:

  1. 安装工具
    sudo apt-get install ora2pg
    
  2. 配置迁移文件
    创建ora2pg.conf:
    SOURCE_TYPE = SQLite
    SOURCE = xxxxx.db
    TARGET = PostgreSQL
    OUTPUT = pg_dump.sql
    
  3. 生成PG兼容SQL
    ora2pg -c ora2pg.conf
    
  4. 导入至PG
    同方案1的导入步骤。

内容的提问来源于stack exchange,提问作者Anarcheese

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 06:27:28