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

Python 使用flask/SQLAlchemy向数据库添加注释字段?,python,flask,sqlalchemy,flask-sqlalchemy,Python,Flask,Sqlalchemy,Flask Sqlalchemy,我正在开发一个flask应用程序,它有一个这样设置的数据库,并且使用SQLAlchemy。(display_name被重命名为persona_name,因为这是steam api所调用的名称。) 我仍在学习如何使用数据库,我现在的工作很好,我可以跟踪一个用户创建的所有列表,我可以从一个用户创建的所有列表中获取嫌疑犯。此外,从嫌疑犯表中删除嫌疑犯似乎也会将嫌疑犯从其出现的所有列表中删除 这似乎很有效,List和Suspect是从db.Model继承的类,而Suspect_List是一个辅助表,它本

我正在开发一个flask应用程序,它有一个这样设置的数据库,并且使用SQLAlchemy。(display_name被重命名为persona_name,因为这是steam api所调用的名称。)

我仍在学习如何使用数据库,我现在的工作很好,我可以跟踪一个用户创建的所有列表,我可以从一个用户创建的所有列表中获取嫌疑犯。此外,从嫌疑犯表中删除嫌疑犯似乎也会将嫌疑犯从其出现的所有列表中删除

这似乎很有效,List和Suspect是从db.Model继承的类,而Suspect_List是一个辅助表,它本身不是一个类

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

我不知道该怎么做,但我有一些想法,不确定它们是否有效或是否会有潜在的负面影响

1) 我是否可以将注释字段添加到可疑列表

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

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

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

至于1和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'))

您真正需要的是关联表,而不是关联表。这里有一个有效的例子

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
从烧瓶导入烧瓶
从flask.ext.sqlalchemy导入sqlalchemy
app=烧瓶(名称)
app.secret_key='MOO'
app.config[“SQLALCHEMY_DATABASE_URI”]=“sqlite://”在内存中。
db=SQLAlchemy(应用程序)
类用户(db.Model):
__tablename_uu='user'
id=db.Column(db.Integer,主键=True)
name=db.Column(db.String)
定义报告(自我):
返回“”。格式(self.name)
可疑类别(数据库模型):
__tablename_uu='suspect'
id=db.Column(db.Integer,主键=True)
steam_name=db.Column(db.String)
定义报告(自我):
返回“”。格式(self.steam\u名称)
类别列表(db.Model):
__tablename_uu='list'
id=db.Column(db.Integer,主键=True)
name=db.Column(db.String())
user\u id=db.Column(db.Integer,db.ForeignKey('user.id'))
user=db.relationship('user',backref=db.backref('lists'))
可疑对象=db.relationship('SuspectList',backref='list')
定义报告(自我):
返回“”。格式(self.name)
类怀疑列表(db.Model):
__tablename_uuu='suspect_ulist'
list\u id=db.Column(db.Integer,db.ForeignKey('list.id'),primary\u key=True)
可疑_id=db.Column(db.Integer,db.ForeignKey('suspect.id'),primary_key=True)
comment=db.Column(db.String)
可疑=数据库关系(“可疑”,backref=db.backref(“可疑列表”))
定义报告(自我):
返回“”%(self.list、self.suspect、self.comment)
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
使用app.app_context():
db.create_all()
黑客=嫌疑犯(steam_name='Bob')
cracker=可疑(steam_name='Alice')
carol=用户(name='carol')
carols_list=list(name='carols',user=carol)
hacker\u suspect=SuspectList(suspect=hacker,comment='RED HAIR')
cracker\u嫌疑犯=嫌疑犯列表(嫌疑犯=cracker,注释='RED EYES')
carols\u list.suspects.append(黑客嫌疑人)
carols_列表。嫌疑犯。追加(cracker_嫌疑犯)
db.session.add(carols#u list)#信任SQLAlchemy添加所有相关的。
db.session.commit()
##查询:
my_list=list.query.filter(User.name==“Carol”).first()
记录在我的清单中。嫌疑人:
打印带有注释{}的{}报告{}。格式(
record.list.user.name,
record.suspect.steam_名称,
记录,评论
)
#卡罗尔报告鲍勃说他有一头红头发
#卡罗尔红着眼睛报告了爱丽丝

两个旁注——我发现将List用作类名有点难看,因为当您想要查询它时,您的默认名称将是
List=List.query.fi….
这有点不方便:)。另外,您使用什么程序生成ERD?

我基本上有一个包含多个嫌疑犯的列表。我试图允许正在使用该应用程序的人在特定列表中添加关于嫌疑人的注释,并且该注释特定于特定列表中的嫌疑人。这看起来只是一条附加到列表中的评论,与特定嫌疑人无关。所以就像清单1中的嫌疑犯1——“这个家伙在口头上辱骂”清单2中的嫌疑犯1(嫌疑犯表中的同一个嫌疑犯)-“我认为这个家伙在作弊”非常感谢你的回答,我可能会尝试对我的项目做一些更改。不过,我确实有一些问题。1) 什么是ERD?你是说我画的那张图吗?如果是这样的话,这就是我用来制作图像并以一种有意义的方式规划数据库的东西。2) tablename实际上是否使数据库中的List/Suspect/SuspectList表具有该名称?3) 您是否建议将列表更改为UserList或其他更有意义的名称?4) 什么时候应该在tableERD=实体关系图上使用关联对象,谢谢——很难找到非难看的工具来创建它们<代码>\uuuu tablename\uuuu允许您指定在数据库中创建的表的名称,这主要是为了清楚起见,我认为Flask SQLAlchemy自动