Ошибка «NULL идентификационный ключ» с использованием базового автомата SQLAlchemy для отражения postgres БД с использованием столбцов IDENTITY - PullRequest
2 голосов
/ 11 апреля 2020

У меня есть база данных 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.ex c .FlushError: Экземпляр имеет нулевую идентичность ключ. > Если это автоматически сгенерированное значение, убедитесь, что таблица базы данных позволяет генерировать новые> значения первичного ключа и что сопоставленный объект Column сконфигурирован для ожидания этих сгенерированных> значений. Также убедитесь, что этот грипп sh () не возникает в неподходящее время, например, в событии load ().

Per https://docs.sqlalchemy.org/en/13/dialects/postgresql.html#postgresql -10-identity-столбцы Я понимаю, что это в некоторой степени недостаток SQLAlchemy, но мне интересно, может ли предлагаемый ими способ обхода работать с автоматически отображаемыми / отраженными базами данных и как я бы это реализовал.

I ' используя SQLAlchemy 1.3.16 и Postgres 11.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...