У меня есть таблица, в которой нет primary key. И я действительно не хочу применять это ограничение к этой таблице.

В SQLAlchemy я определил класс таблицы следующим образом:

class SomeTable(Base):
  __table__ = Table('SomeTable', meta, autoload=True, autoload_with=engine)

Когда я пытаюсь запросить эту таблицу, я получил:

ArgumentError: Mapper Mapper|SomeTable|SomeTable could not assemble any primary key columns for mapped table 'SomeTable'.

Как потерять ограничение, что каждая таблица должна иметь первичный ключ?

28
David S. 15 Дек 2015 в 10:24

3 ответа

Лучший ответ

Я знаю только один способ обойти ограничение первичного ключа в SQL Alchemy - это сопоставить определенный столбец или столбцы с вашей таблицей в качестве первичных ключей, даже если они сами не являются первичными ключами. http://docs.sqlalchemy.org/en/latest/faq/ormconfiguration.html#how-do-i-map-a-table-that-has-no-primary-key.

20
Adam Flanagan 13 Апр 2017 в 08:27

Отказ от ответственности: только Oracle

В базах данных Oracle хранится нечто, называемое rowid, для уникального определения каждой записи в таблице, даже если таблица не имеет первичного ключа. Я решил проблему отсутствия первичного ключа (которую я не вызвал!), Создав свой объект ORM следующим образом:

class MyTable(Base)
    __tablename__ = 'stupid_poorly_designed_table'

    rowid = Column(String, primary_key=True)
    column_a = Column(String)
    column_b = Column(String)
    ...

Вы можете увидеть, как на самом деле выглядит rowid (это шестнадцатеричное значение, я считаю), запустив

SELECT rowid FROM stupid_poorly_designed_table
GO
0
medley56 29 Янв 2020 в 23:08

Для этого нет правильного решения, но есть обходные пути:

Обходной путь 1

Добавление параметра primary_key в существующий столбец, у которого нет первичного ключа, будет работать.

class SomeTable(Base):
    __table__ = 'some_table'
    some_other_already_existing_column = Column(..., primary_key=True) # just add primary key to it whether or not this column is having primary key or not

Обходной путь 2

Просто объявите новый фиктивный столбец на слое ORM, а не в реальной БД . Просто определите в модели SQLalchemy

class SomeTable(Base):
    __table__ = 'some_table'
    column_not_exist_in_db = Column(Integer, primary_key=True) # just add for sake of this error, dont add in db
3
anand tripathi 12 Ноя 2019 в 16:45