python - "NULL identity key"错误使用 SQLAlchemy 的基本自动映射来反射(reflect)使用 IDENTITY 列的 postgres 数据库

标签 python postgresql sqlalchemy

我有一个 postgres 数据库,我试图反射(reflect)它使用现在标准的“身份”列作为主键。

这是我的表定义:

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: Instance <class_label at 0x1091c4ba8> has a NULL identity key.
If this is an auto-generated value, check that the database table allows generation of new primary key values, and that the mapped Column object is configured to expect these generated values. Ensure also that this flush() is not occurring at an inappropriate time, such as within a load() event.



https://docs.sqlalchemy.org/en/13/dialects/postgresql.html#postgresql-10-identity-columns我知道这在某种程度上是 SQLAlchemy 的一个缺点,但我想知道他们建议的解决方法是否适用于自动映射/反射数据库以及我将如何实现它。

我正在使用 SQLAlchemy 1.3.16 和 Postgres 11。

最佳答案

SQLAlchemy 1.4 中添加了一个修复程序

关于python - "NULL identity key"错误使用 SQLAlchemy 的基本自动映射来反射(reflect)使用 IDENTITY 列的 postgres 数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61149073/

相关文章:

postgresql - TypeORM PostgreSQL 选择 JSON 字段等于某个值的位置

sql - Postgresql 表存在,但查询时得到 "relation does not exist"

python - SQLAlchemy、Alembic 和新实例

python - 如何引用尚未定义的类?

python - Django 中的多对多关系

python - 从 Python 中的另一个脚本编辑全局变量

Python 2.7 - 导入错误 : No module named Image

PostgreSQL 数据库的 Python 编码问题

python - 按分隔符拆分 Pandas 中的列值而不丢失分隔符

python - 原始 SQL 到 sqlalchemy 语法