Почему Flask-SQLAlchemy требует первичный ключ?
Если я определю таблицу без первичного ключа:
class CustomAttribute(db.Model):
player = db.Column(db.Integer, db.ForeignKey('player.id'))
key = db.Column(db.Text, nullable=False)
value = db.Column(db.Text, nullable=False)
Я получаю ошибку:
sqlalchemy.exc.InvalidRequestError: Class <class 'rpgquest.models.CustomAttribute'> does not have a __table__ or __tablename__ specified and does not inherit from an existing table-mapped class.
Единственный обходной путь - это определить вручную __tablename__
, но зачем это нужно?
Мне не нужен первичный ключ, так как единственные запросы - получить всех игроков с парой ключ-значение X или получить все пары ключ-значение для определенного игрока, и у игрока не может быть дубликатов ключей.
1 ответ
Flask-SQLAlchemy требует первичный ключ, потому что SQLAlchemy ORM требует первичный ключ:
ORM для SQLAlchemy, для сопоставления с конкретной таблицей, должен иметь хотя бы один столбец, обозначенный как столбец первичного ключа... Большинство ORM требуют, чтобы у объектов был определен некоторый вид первичного ключа, поскольку объект в памяти должен соответствовать уникально идентифицируемая строка в таблице базы данных; по крайней мере, это позволяет объекту быть предназначенным для операторов UPDATE и DELETE, которые будут влиять только на строку этого объекта и никакие другие. Однако важность первичного ключа выходит далеко за рамки этого. В SQLAlchemy все сопоставленные ORM объекты всегда связаны уникальным образом внутри
Session
для их конкретной строки базы данных, используя шаблон, называемый картой идентификации, шаблон, который является центральным для системы единиц работы, используемой SQLAlchemy, а также является ключом к наиболее распространенным (и не очень распространенным) шаблонам использования ORM.