我试图在我的表卖家和物品之间建立一种关系,每个卖家可以卖出任意数量的物品,但不能同时卖出同一物品两次。以下是我所拥有的:
sells = db.Table('sells',
db.Column('seller_email', db.String(), db.ForeignKey('seller.email'), primary_key=True),
db.Column('item_id', db.Integer, ForeignKey('item.id'), primary_key=True)
)
class Item(db.Model):
__tablename__ = 'item'
id = db.Column(db.Integer, primary_key=True)
coverPhoto = db.Column(db.String())
price = db.Column(db.Integer)
condition = db.Column(db.Integer)
title = db.Column(db.String())
def __init__(self, title, coverPhoto, price, condition):
self.coverPhoto = coverPhoto
self.price = price
self.condition = condition
self.title = title
def __repr__(self):
return '<id {}>'.format(self.id)
class Seller(db.Model):
__tablename__ = 'seller'
email = db.Column(db.String(), primary_key=True)
password = db.Column(db.String())
firstName = db.Column(db.String())
lastName = db.Column(db.String())
location = db.Column(db.String())
def __init__(self, email, password, firstName, lastName, location):
self.email = email
self.password = password
self.firstName = firstName
self.lastName = lastName
self.location = location
def __repr__(self):
return "<Seller {email='%s'}>" % (self.email)
我得到以下错误:
^{pr2}$麻烦卖家邮箱以及项目编号是主键,所以它们本身不应该是唯一的吗?在
使用
db.Table
(一个SQLAlchemy核心函数)创建表sells
。这没什么错。然后使用SQLAlchemy ORM的声明性语法从db.Model
继承来创建其他表。(如果您不熟悉sqlalchemycore和ORM之间的区别,那么本教程是一个很好的起点。)这里有几个潜在的问题:
您使用的是
db.Model
和SQLAlchemy ORM的声明性语法。这样做时,模型子类不需要__init__
函数。事实上,使用__init__
很可能会导致问题(甚至可能是根本原因),因为它会干扰SQLAlchemy为使声明性语法如此方便而进行的monkey修补。。。我怀疑这里的根本原因可能实际上是您使用SQLAlchemy Core创建一个表,其中包含对SQLAlchemy ORM托管表的外键引用。通常,当您执行
db.metadata.create_all()
操作时,SQLAlchemy将收集所有表/模型映射,查看依赖项并找出向数据库发出CREATE TABLE
/ADD CONSTRAINT
命令的正确顺序。这种隐藏的依赖关系解析允许应用程序程序员定义一个表,该表包含后面定义的表的外键。当您有一个基于核心的Table
对象引用基于ORMdb.Model
的对象时,可能会阻止依赖关系解析在表创建过程中正常工作。我不是百分之百地确信这是问题所在,但是值得尝试一下让所有表都成为Table
对象,或者db.Model
子类。如果你不确定,我建议后者。相关问题 更多 >
编程相关推荐