SQLAlchemy,运行connection.execute()返回意外错误

时间:2018-06-18 20:18:24

标签: python postgresql sqlalchemy

我正在尝试将多个表的结构从一个数据库复制到另一个数据库:

import re
from sqlalchemy import inspect, create_engine, MetaData
from sqlalchemy.schema import CreateTable
from sqlalchemy.sql import text

orig_db = create_engine(o_url)
new_db = create_engine(n_url)

orig_md = MetaData()
orig_md.reflect(orig_db)

for table in orig_md.sorted_tables:
  table.create(new_db)

使用唯一的id列创建原始表时,即:

CREATE TABLE foo (
    id SERIAL
);

此方法返回错误,因为原始数据库用于创建每个新id的序列对象不会由MetaData.reflect()方法带来。为了解决这个问题,我将for循环下的行更改为:

for table in orig_md.sorted_tables:
  statement = CreateTable(table)
  raw_sql = str(statement.compile()).strip()
  raw_sql = re.sub(r'\w+ DEFAULT nextval.*NOT NULL', r'SERIAL', raw_sql)

  new_db.execute(text(raw_sql))

正则表达式变成类似

CREATE TABLE foo (
    a INTEGER DEFAULT nextval('foo_seq'::regclass) NOT NULL, 
    b VARCHAR, 
    c BIGINT, 
    d DOUBLE_PRECISION
)

CREATE TABLE foo (
    a SERIAL, 
    b VARCHAR, 
    c BIGINT, 
    d DOUBLE_PRECISION
)

这会为a列创建具有自己的序列对象的新表,据我所知,一切都应该是好的。但是,在这样做之后,我开始遇到其他错误。例如,当raw_sql等于上面的regexed字符串时,我得到错误(psycopg2.ProgrammingError) type "double_precision" does not exist(虽然在表格中使用此类型没有问题,我不必处理SERIAL问题)。

raw_sql时:

CREATE TABLE bar (
    id SERIAL, 
    x ARRAY
)

我收到错误(psycopg2.ProgrammingError) syntax error at or near "ARRAY"

使用table.create(new_db)时不会突然出现这些错误,但使用new_db.execute(text(raw_sql))时会出现这些错误。任何想法为什么会发生这种情况?

0 个答案:

没有答案