【问题标题】:sqlalchemy '(sqlite3.OperationalError) near "(": syntax error'sqlalchemy '(sqlite3.OperationalError)靠近“(”:语法错误'
【发布时间】:2020-02-01 01:29:32
【问题描述】:

我们正在尝试使用 sqlalchemy 将大表(大于本地内存空间)从 postgresql 数据库迁移到本地 sqlite3 数据库,但是在尝试在 sqlite3 数据库中创建表时遇到语法错误。阅读其他帖子,建议的修复似乎不适用于此错误。我们在这里遗漏了一些使用细节吗?

# reflect table from remote postgresql database
read_engine = create_engine('postgresql://dbusername:dbuserpassword@server/dbname')

meta = MetaData()
raw = Table('db_table', meta, autoload=True, autoload_with=read_engine)

# write table to local sqlite3 database
write_engine = create_engine('sqlite:///db_local.sqlite3')

table.create(write_engine)

这是我们得到的错误:

OperationalError: (sqlite3.OperationalError) near "(": syntax error
[SQL: 
CREATE TABLE db_table (
    id INTEGER DEFAULT nextval('db_table_id_seq'::regclass) NOT NULL, 
    created_at TIMESTAMP, 
    updated_at TIMESTAMP, 
    data TEXT, 
    device_key TEXT, 
    format TEXT, 
    uuid TEXT, 
    CONSTRAINT db_table_pkey PRIMARY KEY (id)
)

]

【问题讨论】:

  • 我想 SQLite 无法解析 nextval( 因为它不支持序列。您可以在执行table.create() 之前调整表架构;在许多情况下,可以将 Postgres 模式适应 SQLite。
  • 谢谢@9000。我找到了关于覆盖反射列docs.sqlalchemy.org/en/13/core/reflection.html 的文档,并且有效!
  • 很好奇,为什么要将超过内存容量的数据从企业服务器 RDBMS Postgres 迁移到文件级(非服务器)RDBMS SQLite?

标签: python postgresql sqlite sqlalchemy


【解决方案1】:

我认为问题在于 SQLite 不支持 DEFAULT nextval(...) -- nextval() 是 Postgres 特有的函数,它不是 SQLite 数据库的一部分。

我相信你需要重写CREATE TABLE 语句才能使用AUTOINCREMENT

披露:我是EnterpriseDB (EDB) 员工

【讨论】:

  • 有道理,但 SqlAlchemy 正在创建 CREATE TABLE 语句。我确实找到了有关覆盖反射列 link 的信息,并在 raw = Table() 语句中添加了 'Column('id', Integer, primary_key=True)' 并且有效。
猜你喜欢
  • 2021-05-11
  • 2019-02-07
  • 2020-02-06
  • 2019-01-12
  • 2014-05-17
  • 2021-10-19
  • 2018-07-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多