我正在开发一个烧瓶应用程序,它有一个像这个设置的数据库并且正在使用SQLAlchemy。 (display_name被重命名为persona_name,因为这是steam api所称的。)
我仍在学习如何使用数据库,以及我现在的工作正常,我可以跟踪用户所做的所有列表,并且我可以从一个用户所做的所有列表中获取嫌疑人。此外,从可疑表中删除嫌疑人似乎也将嫌疑人从其出现的所有列表中删除。
这似乎运行良好,List和Suspect是从db.Model继承的类,而suspect_list是一个本身不是类的辅助表。
设置方式我希望能够让嫌疑人出现在多个列表中,但现在我希望能够在个别列表中为个别嫌疑人添加评论。
我不知道如何解决这个问题,但我有一些想法,我不确定它们是否有效或潜在的缺点。
1)我可以在suspect_list中添加注释字段吗?
2)我是否将注释模型作为继承自db.Model的类,然后将其添加到辅助表中?
3)我是否应该为可疑表创建一个新的id字段,使其成为主键而不是steam_id,然后添加注释字段,以便可能存在具有不同注释的重复嫌疑人?
我可能会实现3但我不认为这是一个好主意,因为同一个嫌疑人的重复可能是应该避免的。
对于1和2我不知道他们是否会工作,如果他们这样做,我不知道如何正确实施它们。
This is the code that I have for my Models.py if it is needed
我的问题是如何正确地为我已设置的数据库模型添加注释?
答案 0 :(得分:1)
而不是关联表,你真的需要一个association object。这是一个有效的例子。
from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.secret_key = 'MOO.'
app.config["SQLALCHEMY_DATABASE_URI"] = 'sqlite://' # In memory.
db = SQLAlchemy(app)
class User(db.Model):
__tablename__ = 'user'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String)
def __repr__(self):
return '<User {}>'.format(self.name)
class Suspect(db.Model):
__tablename__ = 'suspect'
id = db.Column(db.Integer, primary_key=True)
steam_name = db.Column(db.String)
def __repr__(self):
return '<Suspect {}>'.format(self.steam_name)
class List(db.Model):
__tablename__ = 'list'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String())
user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
user = db.relationship('User', backref=db.backref('lists'))
suspects = db.relationship('SuspectList', backref='list')
def __repr__(self):
return '<List {}>'.format(self.name)
class SuspectList(db.Model):
__tablename__ = 'suspect_list'
list_id = db.Column(db.Integer, db.ForeignKey('list.id'), primary_key=True)
suspect_id = db.Column(db.Integer, db.ForeignKey('suspect.id'), primary_key=True)
comment = db.Column(db.String)
suspect = db.relationship('Suspect', backref=db.backref("suspect_list"))
def __repr__(self):
return '<SL: %s %s %s>' % (self.list, self.suspect, self.comment)
if __name__ == '__main__':
with app.app_context():
db.create_all()
hacker = Suspect(steam_name='Bob')
cracker = Suspect(steam_name='Alice')
carol = User(name='Carol')
carols_list = List(name='Carols', user=carol)
hacker_suspect = SuspectList(suspect=hacker, comment='RED HAIR')
cracker_suspect = SuspectList(suspect=cracker, comment='RED EYES')
carols_list.suspects.append(hacker_suspect)
carols_list.suspects.append(cracker_suspect)
db.session.add(carols_list) # Trust SQLAlchemy to add all related.
db.session.commit()
## Querying:
my_list = List.query.filter(User.name == 'Carol').first()
for record in my_list.suspects:
print '{} reported {} with comment {}'.format(
record.list.user.name,
record.suspect.steam_name,
record.comment
)
# Carol reported Bob with comment RED HAIR
# Carol reported Alice with comment RED EYES
两个附注 - 我发现使用List作为类名有点难看,因为当你想查询它时,你的默认名称是list = List.query.fi....
,这有点不走 :)。另外,您使用什么程序来生成ERD?
答案 1 :(得分:0)
如果我正确理解,我只会创建一个与您的列表模型相关的新模型
class Comments(db.Model):
id = db.Column(db.Integer, primary_key=True)
comment = db.Column(db.String(300))
list_id = db.Column(db.Integer, db.ForeignKey('list.id'))