обновить таблицу без первичного ключа, но с уникальным индексом - PullRequest
0 голосов
/ 04 октября 2019

У меня есть таблица без первичного ключа, но с уникальным индексом. Я пытался использовать sqlAlchemy ORM и попал в проблему. При обновлении у меня появляется эта ошибка:

sqlalchemy.orm.exc.FlushError: Can't update table table_name using NULL for primary key value on column table_name.column_7.

Я нахожусь на Windows, Python 3.7, SqlAlchemy 1.3.8, Oracle Client 18, Oracle 12.2

Определение таблицы:

class ClassName (Base):

__tablename__ = 'table_name'
date_created = Column('date_created', DateTime,
                      default=datetime.datetime.now)
created_by = Column('created_by', String(30))
date_modified = Column('date_modified', DateTime,
                       onupdate=datetime.datetime.now)
modified_by = Column('modified_by', String(30))
column_1 = Column('column_1', String(50), nullable=False)
column_2 = Column('column_2', DATE, nullable=False, default=datetime.date.today)
column_3 = Column('column_3', Integer, nullable=False)
column_4 = Column('column_4', Numeric, nullable=False)
column_5 = Column('column_5', Integer, nullable=False)
column_6 = deferred(Column('column_6', String(4000)))
column_7 = Column('column_7', Integer)
__table_args__ = (UniqueConstraint('column_1', 'column_2', 'column_3', 'column_5', 'column_7', name='unique_index_name'),
                  )
__mapper_args__ = {
    'primary_key': [column_1, column_2, column_3, column_5,column_7]
}

Один из столбцов в уникальном индексе column_7 может быть нулевым, поэтому в операции обновления он отправляется следующим образом column_7 = null or exitingObject.column_7 = None, но даже если Oracleподдержка уникального индекса с нулевыми значениями, кажется, что SqlAlchemy не поддерживает это. Я знаю, что у меня может быть отдельный столбец, который может выполнять эту работу, но я не знаю, как изменить структуру таблицы. Есть ли хитрость, которая может сделать эту работу?

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