首页 文章

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

提问于
浏览
0

我正在研究一个烧瓶应用程序,它有一个像这样设置的数据库
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 回答

  • 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?

  • 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'))
    

相关问题