我正在尝试将多个表的结构从一个数据库复制到另一个数据库:
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))
时会出现这些错误。任何想法为什么会发生这种情况?