Python SQL Alchemy在多对多关系中插入数据

Python SQL Alchemy在多对多关系中插入数据,python,python-3.x,sqlalchemy,Python,Python 3.x,Sqlalchemy,为了促进多对多关系,我在SQL Alchemy中有3个表声明,如下所示 BusLink=表格( “母线连接”, DB.metadata, 列(“component_id”,字符串(36),外键(“Bus.componentId”), 列(“algorithm_id”、整数、外键(“algorithm.algorithmId”), ) 等级总线(DB): __tablename=“总线” 组件id=列(“组件id”,字符串(36),可空=假,主键=真) end\u client\u id=Col

为了促进多对多关系,我在SQL Alchemy中有3个表声明,如下所示


BusLink=表格(
“母线连接”,
DB.metadata,
列(“component_id”,字符串(36),外键(“Bus.componentId”),
列(“algorithm_id”、整数、外键(“algorithm.algorithmId”),
)
等级总线(DB):
__tablename=“总线”
组件id=列(“组件id”,字符串(36),可空=假,主键=真)
end\u client\u id=Column(“endClientId”,字符串(50),null=False)
end_client_type=Column(“endClientType”,字符串(50),null=False)
组件类型=列(“组件类型”,字符串(50),可空=真)
description=列(“description”,Text,nullable=True)
大小=列(“大小”,整数,可空=真)
文件名=列(“文件名”,字符串(50),可空=真)
file_path=Column(“filePath”,字符串(50),nullable=True)
file_hash=Column(“fileHash”,字符串(50),nullable=True)
验证日期=列(“验证日期”,日期时间,可空=假,主键=真,默认值=日期时间.utcnow)
算法=关系(
“算法”,
次级=母线连接,
backref=backref(“算法”,lazy=“动态”),
cascade=“全部,保存更新”,
)
#存储组件的活动状态
活动=列(“活动”,布尔值,默认值=真)
类算法(DB):
__tablename_=“算法”
算法id=列(“算法id”,整数,可空=假,主键=真,自动递增=真)
算法类型=列(“算法类型”,字符串(50),可空=假,唯一=真)
supports_seed=列(“supportsSeed”,布尔值,null=False)
supports_salt=列(“supportsSalt”,布尔值,nullable=False)
supports_offset=列(“supportsOffset”,布尔值,可空=False)
总线=关系(
“总线”,次级=母线连接,
cascade=“全部,保存更新”
)
活动=列(“活动”,布尔值,默认值=真)
我需要在保存总线时分配已经创建的算法

#创建3个算法->im使用以下代码
异步def保存_数据(自身,**kwargs):
"""
保存算法对象并返回
"""
尝试:
将BUSDB()作为数据库:
结果=(
db.session.query(算法)
.filter(Algorithm.Algorithm_type==kwargs[“Algorithm_type”],Algorithm.active==True)
.first()
)
如果结果是:
返回{“Error”:f“算法{kwargs['Algorithm_type']}已存在”}
结果=(
db.session.query(算法)
.filter(Algorithm.Algorithm_type==kwargs[“Algorithm_type”],Algorithm.active==False)
.first()
)
如果结果是:
session.query(算法).filter(
Algorithm.Algorithm\u type==kwargs[“Algorithm\u type”],Algorithm.active==False
).update({Algorithm.active:True})
db.session.commit()
数据=数据到数据(
db.session.query(Algorithm).filter(Algorithm.Algorithm_id==kwargs[“Algorithm_id”]).first()
)
data.pop(“活动”)
返回数据
数据=算法(**kwargs)
db.session.add(数据)
db.session.commit()
db.session.refresh(数据)
数据=数据到数据(数据)
data.pop(“活动”)
返回数据
在创建总线对象时,我需要分配一个或多个算法 为此,我有以下代码

async def save_数据(self,**kwargs):
组件id=kwargs[“组件id”]
尝试:
将BUSDB()作为数据库:
总线\对象=总线(
组件id=组件id,
component_type=kwargs.get(“component_type”),
description=kwargs.get(“description”),
size=kwargs.get(“size”),
file_name=kwargs.get(“file_name”),
file_path=kwargs.get(“file_path”),
file\u hash=kwargs.get(“file\u hash”),
)
#问题就在这里
对于kwargs[“算法”]中的数据:
bus_object.algorithm.append(
算法(
算法id=数据[“算法id”],
算法类型=数据[“算法类型”],
supports_offset=data[“supportsOffset”],
supports_salt=数据[“supportsSalt”],
supports_seed=data[“supportsSeed”],
)
)
db.session.add(总线对象)
db.session.commit()
返回{“Success”:True}
例外情况除外,如e:
db.session.rollback()
提高e
上面的代码尝试创建一个新的Algorithm对象,即使它可用
如何解决这个问题,使用已经可用的算法对象,而不是试图创建它?

这段代码很酷。我建议您避免直接在“bus_object.Algorithm.append”中调用“Algorithm”,因为这样总是会创建一个新对象,即使algorithmtype已经存在。您可以稍微更改第一个save_data方法,使其(对于给定的算法类型)创建一个新的、激活一个非活动的或返回一个现有算法。然后首先调用这个新方法,然后在bus_object.algorithm.append.Cool代码段中使用生成的对象。我建议您避免直接在“bus_object.Algorithm.append”中调用“Algorithm”,因为这样总是会创建一个新对象,即使algorithmtype已经存在。你可以稍微改变一下你的第一步