为什么Flask-SQLAlchemy需要主键?

时间:2017-02-22 13:06:49

标签: python sqlalchemy primary-key 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 个答案:

答案 0 :(得分:4)

Flask-SQLAlchemy需要主键,因为the SQLAlchemy ORM requires a primary key

  

SQLAlchemy ORM为了映射到特定的表,需要至少有一列表示为主键列...大多数ORM要求对象具有某种主键,因为内存中的对象必须对应于数据库表中唯一可识别的行;至少,这允许对象可以作为UPDATE和DELETE语句的目标,这些语句将仅影响该对象的行而不影响其他行。但是,主键的重要性远不止于此。在SQLAlchemy中,所有ORM映射对象始终使用称为身份映射的模式在Session内唯一地链接到其特定数据库行,该模式是SQLAlchemy使用的工作单元系统的核心,并且是也是ORM使用最常见(也就是不太常见)模式的关键。