我正在使用flask-sqlalchemy
构建一个webapp,我有以下模型:
class Post(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(80), unique=True)
candidates = db.relationship('Candidate', backref='post', lazy='dynamic')
def __init__(self, name):
self.name = name
def __repr__(self):
return "<Post %r>" % self.name
class Candidate(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(80), primary_key=True)
post_id = db.Column(db.Integer, db.ForeignKey('post.id'))
hostel = db.Column(db.String(80))
yes_no = db.Column(db.Boolean)
#votes = db.relationship('Vote', backref='vote', lazy="dynamic")
def __init__(self, name, hostel, post_id, yes_no):
self.name = name
self.hostel = hostel
self.post_id = post_id
self.yes_no = yes_no
def __repr__(self):
return "<Candidate: %r, Post: %r>" % (self.name, self.post.name)
在数据库设计方面,我完全是noob,所以我真的很感激我对一些基本查询的一些指示
是否需要id
列?我见过的大多数教程都将其作为专栏(具体为主键)。我可以不用它吗?特别是在我有另一个主键的情况下?
如果post_id是外键,我如何在Candidate#Name和Candidate#post_id列上有一个复合键约束。
如何“刷新”我的数据库。在我对模型进行更改后,如何确保这些更改反映在实际表中?我需要手动drop_all
和create_all
吗?
最后,sqlalchemy
文档是否也适用于flask-sqlalchemy
?
答案 0 :(得分:22)
是否需要id列?我见过的大多数教程都将其作为专栏(具体为主键)。我可以不用它吗?特别是在我有另一个主键的情况下?
对于邮政表,是的。对于另一个,没有。有些人可能会争辩说,因为名称是唯一的,所以将其作为主键,但这意味着使用您需要的名称任何地方来引用该帖子,这意味着更多空间(名称与int的长度) (不一定是问题)并考虑“如果候选名称发生变化怎么办?”。但是,你当然不需要两者。
如果post_id是外键,我如何在Candidate#Name和Candidate#post_id列上有一个复合键约束。
您是如何做到的,每个帖子都分配到一个帖子:
candidates = db.relationship('Candidate', backref='post', lazy='dynamic')
因此,不应将该字段称为candidates
,而应将candidate
称为有意义。
要回答您的问题,我将引用the docs:
在约束/索引中指定多个列或指定 显式名称,使用UniqueConstraint或Index构造 明确。
您需要将其添加到模型定义中:
__table_args__ = (
UniqueConstraint("id", "candidate_id"),
)
虽然我觉得它在这里没用(你为什么需要它?如果id是唯一的(主键),那么包含它的任何其他组合都是唯一的)...
如何“刷新”我的数据库。在我对模型进行了更改之后, 如何确保这些更改反映在实际表格中? 我需要手动drop_all和create_all吗?
您需要commit
对数据库进行更改。来自flask-sqlalchemy's documentation:
db.session.add(post)
db.session.commit()
最后,sqlalchemy文档是否适用于flask-sqlalchemy 好?
注意这是我自己发现的,没有“官方”来源,只需阅读flask-sqlalchemy的来源。
是的,不同之处在于您访问模型,会话和引擎的方式...... 例如,在sqlalchemy中:
from sqlalchemy.orm import sessionmaker
Session = sessionmaker()
session = session()
session.commit()
在flask-sqlalchemy中:
db.session.commit()
对于“模特”:
# In sqlalchemy
Base = declarative_base()
class Post(Base):
# ...
# In flask-sqlalchemy
class Post(db.Model):
# ...
等...
无论如何,你用sqlalchemy的方式做了一次,你做了一次,而flask-sqlalchemy在后台为你做了。
希望它有所帮助:)(这不仅仅是关于sqlalchemy中复合键的一个问题......)