使用flask / SQLAlchemy向数据库添加注释字段?

时间:2014-10-24 17:58:15

标签: python flask sqlalchemy flask-sqlalchemy

我正在开发一个烧瓶应用程序,它有一个像这个like this设置的数据库并且正在使用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

我的问题是如何正确地为我已设置的数据库模型添加注释?

2 个答案:

答案 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'))