如果我定义没有主键的表:
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的键值对,或获得某个玩家的所有键值对,并且玩家不能有重复的密钥。
答案 0 :(得分:4)
Flask-SQLAlchemy需要主键,因为the SQLAlchemy ORM requires a primary key:
SQLAlchemy ORM为了映射到特定的表,需要至少有一列表示为主键列...大多数ORM要求对象具有某种主键,因为内存中的对象必须对应于数据库表中唯一可识别的行;至少,这允许对象可以作为UPDATE和DELETE语句的目标,这些语句将仅影响该对象的行而不影响其他行。但是,主键的重要性远不止于此。在SQLAlchemy中,所有ORM映射对象始终使用称为身份映射的模式在
Session
内唯一地链接到其特定数据库行,该模式是SQLAlchemy使用的工作单元系统的核心,并且是也是ORM使用最常见(也就是不太常见)模式的关键。