为什么 Flask-SQLAlchemy 需要主键?

Mar*_*nen 1 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)
Run Code Online (Sandbox Code Playgroud)

我收到一个错误:

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.
Run Code Online (Sandbox Code Playgroud)

唯一的解决方法是手动定义__tablename__,但为什么需要这样做?

我不需要主键,因为唯一的请求是获取具有 X 键值对的所有玩家,或者获取某个玩家的所有键值对,并且玩家不能有重复的键。

jwo*_*der 5

Flask-SQLAlchemy 需要一个主键,因为SQLAlchemy ORM 需要一个主键

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