【问题标题】:Adding a comments field to database with flask/SQLAlchemy?使用烧瓶/SQLAlchemy 向数据库添加评论字段?
【发布时间】:2014-10-24 17:58:14
【问题描述】:

我正在开发一个烧瓶应用程序,该应用程序具有像 这样设置的数据库,并且正在使用 SQLAlchemy。 (display_name 已重命名为 persona_name,因为 Steam api 就是这么称呼它的。)

我仍在学习如何使用数据库,我现在可以正常工作,我可以跟踪用户创建的所有列表,并且我可以从一个用户创建的所有列表中找出嫌疑人。此外,从嫌疑人表中删除嫌疑人似乎也将嫌疑人从其出现的所有列表中删除。

这似乎运作良好,List 和 Suspect 是从 db.Model 继承的类,而 Suspect_list 是一个辅助表,它本身不是一个类。

它的设置方式我希望能够让嫌疑人出现在多个列表中,但现在我希望能够为个人列表中的单个嫌疑人添加 cmets。

我不知道该怎么做,但我有一些想法,不确定它们是否有效或是否有潜在的缺点。

1) 我可以在suspect_list 中添加评论字段吗?

2) 我是否将注释模型作为继承自 db.Model 的类,然后将其添加到辅助表中?

3) 我是否应该为可疑表创建一个新的 id 字段,将其设为主键而不是 steam_id ,然后添加一个注释字段,这样就可以存在具有不同 cmets 的重复嫌疑人?

我可能可以实现 3,但我认为这不是一个好主意,因为同一嫌疑人的重复可能是应该避免的。

至于 1 和 2 我不知道它们是否会起作用,如果它们起作用我不确定如何正确实施它们。

This is the code that I have for my Models.py if it is needed

我的问题是如何正确地将 cmets 添加到我设置的这个数据库模型中?

【问题讨论】:

    标签: python flask sqlalchemy flask-sqlalchemy


    【解决方案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) 什么是 ERD?你的意思是我做的图表图像?如果是这样,this 就是我用来制作图像并以有意义的方式规划数据库内容的工具。 2) tablename 是否实质上使数据库中的 List/Sus​​pect/Sus​​pectList 表具有该名称? 3)您是否建议将 List 更改为 UserList 或其他更有意义的名称? 4) 我什么时候应该在表格上使用关联对象
    • ERD = 实体关系图,谢谢——很难找到不丑陋的工具来创建它们。 __tablename__ 让您指定在数据库中创建的表的名称是什么,这主要是为了清楚起见,我认为 Flask-SQLAlchemy 会自动命名表,但有时它可能会以与您期望的方式不太一样的方式这样做——这消除了这种风险。是的,UserList 在我看来信息量更大。
    • 当您只使用关联表进行连接时,您会使用关联表——它本质上成为两个对象之间的透明双向桥梁。这非常非常方便,但是因为它是透明的,所以当您想要执行诸如添加评论列之类的操作时,它不起作用,因为它对您的对象是透明的,因此没有简单的方法来提取评论列数据。那是您迁移到关联对象的时候——因为您希望它成为一个真实的事物(一个对象),以便您可以查看它。
    【解决方案2】:

    如果我理解正确,我会创建一个与您的列表模型相关的新模型

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

    【讨论】:

    • 我基本上有一个包含多个嫌疑人的列表。我试图允许使用该应用程序的人在特定列表中添加关于嫌疑人的评论,并且该评论特定于该特定列表中的嫌疑人。这看起来只是附加到 1 个列表的 1 条评论,与特定嫌疑人没有任何关系。所以就像清单 1 嫌疑人 1 - “这个人口头辱骂”清单 2 嫌疑人 1(嫌疑人表中的同一嫌疑人) - “我认为这个人在作弊”
    猜你喜欢
    • 2020-11-12
    • 1970-01-01
    • 2018-02-26
    • 2018-10-26
    • 1970-01-01
    • 2019-03-30
    • 1970-01-01
    • 2015-06-17
    • 2013-11-22
    相关资源
    最近更新 更多