flask sqlalchemy:如何在多对多关系中多次插入重复记录
我正在使用flask sqlalchemy并尝试在多对多关系中插入重复记录。但是,只能插入一项。例如,考虑下面的代码:flask sqlalchemy:如何在多对多关系中多次插入重复记录,flask,sqlalchemy,flask-sqlalchemy,Flask,Sqlalchemy,Flask Sqlalchemy,我正在使用flask sqlalchemy并尝试在多对多关系中插入重复记录。但是,只能插入一项。例如,考虑下面的代码: db = SQLAlchemy(app) call_global_variable = db.Table('call_global_variable', db.Column('call_id', db.Integer, db.ForeignKey('call.id')), db.Column('global_variable_id', db.Integer, d
db = SQLAlchemy(app)
call_global_variable = db.Table('call_global_variable',
db.Column('call_id', db.Integer, db.ForeignKey('call.id')),
db.Column('global_variable_id', db.Integer, db.ForeignKey('global_variable.id'))
)
class Call(db.Model):
__tablename__ = 'call'
id = db.Column(db.Integer, primary_key = True)
callee_id = db.Column(db.Integer, db.ForeignKey('function.id'))
callee = db.relationship('Function', foreign_keys = [callee_id])
arg_list = db.relationship('GlobalVariable', secondary = call_global_variable, lazy = 'dynamic')
class Function(db.Model):
__tablename__ = 'function'
id = db.Column(db.Integer, primary_key = True)
name = db.Column(db.String(20))
type = db.Column(db.String(20))
def __repr__(self):
return self.name
class GlobalVariable(db.Model):
__tablename__ = 'global_variable'
id = db.Column(db.Integer, primary_key = True)
name = db.Column(db.String(20))
type = db.Column(db.String(20))
def __repr__(self):
return self.name
func = Function(name = 'func', type = 'void')
gvar0 = GlobalVariable(name = 'a', type = 'int')
gvar1 = GlobalVariable(name = 'b', type = 'int')
call = Call(callee = func, arg_list = [gvar0, gvar0, gvar0, gvar0, gvar1])
db.session.add_all([func, gvar0, gvar1, call])
db.session.commit()
print len(list(call.arg_list))
现在我想存储调用站点
func(a,a,a,a,b)
其中func
是一些函数,a
和b
是全局变量。因此,我希望call.arg_list
包含4个重复的gvar0
(对于a
),因为a
发生4次。但是,len(list(call.arg_list))
的结果是2。我猜原因可能是sqlalchemy删除了重复的gvar0
。因此,我的问题是如何声明Call
和GlobalVariable
的模型以及表Call\u global\u variable
,以便我可以将多个重复记录(例如gvar0
)插入多对多关系Call.arg\u list
?谢谢 为什么需要这样做?@univerio每个用户
都应该填写10个地址
-es。如果用户
只有一个地址,则其余9个地址
应填写相同的地址,以便在修改某些地址.name
时,也会修改其余地址。一种直观的方法是复制地址
。然而,炼金术不允许这样的复制。出于您的目的,如果使用只有一个地址,您只能保存一次地址。我认为这不是直观的。为什么需要数据库正好包含10个地址?你不能。表是集合,而不是列表。您需要将一列添加到名为call\u global\u variable
的arg\u pos
并手动管理它。