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

使用Sequel迁移Django站点SQLite3至PostgreSQL遇字段过长错误求助

解决SQLite3到PostgreSQL迁移时Sequel的字段长度截断错误

问题背景

基于Django搭建的站点,从SQLite3迁移到PostgreSQL时,使用Sequel工具执行命令:

sequel -C sqlite://db.sqlite3 config/database.yml

出现错误:

Error: Sequel::DatabaseError: PG::StringDataRightTruncation: ERROR:  value too long for type character varying(64)

原因是Sequel默认的SQLite到PostgreSQL类型映射中,将部分文本类型映射为varchar(64),但源数据中存在超过该长度的内容。

解决方法

1. 定位具体报错的字段

添加verbose参数执行迁移命令,查看详细报错上下文,精准定位触发截断的表和字段:

sequel -C -v sqlite://db.sqlite3 config/database.yml

2. 临时调整目标表字段长度

  • 先通过Django初始化PostgreSQL的表结构(需先修改settings.py的数据库配置为PostgreSQL):
    python manage.py migrate
    
  • 登录PostgreSQL,将报错的varchar(64)字段修改为更长的类型(如varchar(255)或TEXT):
    ALTER TABLE 目标表名 ALTER COLUMN 字段名 TYPE TEXT;
    
  • 再次执行Sequel迁移命令完成数据导入,之后可根据Django模型定义,将字段改回对应长度(需确保源数据无超出模型限制的内容,或手动截断过长数据)。

3. 自定义Sequel类型映射规则

编写Ruby脚本自定义类型转换逻辑,避免默认的短长度映射:

require 'sequel'

# 连接源SQLite和目标PostgreSQL数据库
source_db = Sequel.sqlite('db.sqlite3')
target_db = Sequel.postgres(
  'erogazou_site',
  user: 'erogazou_site',
  host: 'localhost',
  password: '你的数据库密码'
)

# 覆盖默认的SQLite到PostgreSQL类型转换规则
Sequel::Database.transformers[:sqlite_to_postgres] = lambda do |type|
  case type
  when 'TEXT', 'VARCHAR'
    # 将SQLite文本类型映射为PostgreSQL的TEXT,规避长度限制
    'TEXT'
  else
    # 其他类型沿用默认转换逻辑
    Sequel::Database::DEFAULT_TRANSFORMERS[:sqlite_to_postgres].call(type)
  end
end

# 逐表批量迁移数据
source_db.tables.each do |table|
  puts "正在迁移表: #{table}"
  target_db[table].insert_multiple(source_db[table].all)
end

执行该脚本即可完成自定义规则下的数据迁移。

4. 使用Django原生工具迁移(推荐)

对于Django项目,原生工具适配性更强,步骤如下:

  1. 修改settings.py中的DATABASES配置为PostgreSQL:
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.postgresql',
            'NAME': 'erogazou_site',
            'USER': 'erogazou_site',
            'HOST': 'localhost',
            'PASSWORD': '你的数据库密码',
            'PORT': '5432',
        }
    }
    
  2. 初始化PostgreSQL表结构:
    python manage.py migrate
    
  3. 从SQLite导出数据(排除易冲突的权限和内容类型):
    python manage.py dumpdata --exclude auth.permission --exclude contenttypes > data.json
    
  4. 将数据导入PostgreSQL:
    python manage.py loaddata data.json
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 22:57:51