[英]SQLAlchemy MetaData.reflect() vs. automap_base.prepare()
[英]“NULL identity key” error using SQLAlchemy's base automap to reflect a postgres DB using IDENTITY columns
我有一个我试图反映的 postgres 数据库,它使用现在标准的“身份”列作为主键。
这是我的表定义:
create table class_label (
class_label_id integer PRIMARY KEY GENERATED ALWAYS AS IDENTITY,
class_name varchar not null,
default_color varchar,
created_dttm timestamp default current_timestamp NOT NULL,
created_by varchar DEFAULT USER NOT NULL,
updated_dttm timestamp default current_timestamp NOT NULL,
updated_by varchar DEFAULT user NOT NULL
);
这是我的代码:
from sqlalchemy import create_engine, MetaData, insert, Table, or_, and_, func
from sqlalchemy.ext.automap import automap_base
from sqlalchemy.orm import scoped_session, sessionmaker
import os
from sqlalchemy.schema import CreateColumn
from sqlalchemy.ext.compiler import compiles
@compiles(CreateColumn, 'postgresql')
def use_identity(element, compiler, **kw):
text = compiler.visit_create_column(element, **kw)
text = text.replace("SERIAL", "INT GENERATED BY DEFAULT AS IDENTITY")
return text
usr = os.environ.get("POSTGRES_USR")
pwd = os.environ.get("POSTGRES_PWD")
host = os.environ.get("POSTGRES_HOST")
engine = create_engine('postgresql://' + usr + ':' + pwd + host, convert_unicode=True)
session = scoped_session(sessionmaker(bind=engine))
metadata = MetaData(bind=engine)
metadata.reflect(engine, only=['class_label'])
Base = automap_base(metadata=metadata)
Base.prepare()
Class_Label = Base.classes.class_label
session.add(Class_Label(class_name="Testing", default_color="red"))
session.commit()
当我运行我的代码时,我得到这个错误:
sqlalchemy.orm.exc.FlushError:实例 <class_label at 0x1091c4ba8> 具有 NULL 身份密钥。
如果这是一个自动生成的值,请检查数据库表是否允许生成新的主键值,以及映射的列 object 是否配置为预期这些生成的值。 还要确保此 flush() 不会在不适当的时间发生,例如在 load() 事件中。
Per https://docs.sqlalchemy.org/en/13/dialects/postgresql.html#postgresql-10-identity-columns I understand that this is somewhat a shortcoming of SQLAlchemy, but I'm wondering if the work-around they建议可以用于自动映射/反射数据库以及我将如何实现它。
我正在使用 SQLAlchemy 1.3.16 和 Postgres 11。
在SQLAlchemy 1.4中添加了一个修复程序
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.