在python中,mysql.connector不使用multi标志执行insert into
我有一点复杂的MySQL插入,它设置一些变量,连接一些表,聚合值,然后尝试插入到表中。当我尝试使用DBeaver执行时,这个sqlinsert命令可以工作 当我尝试在没有插入部分的情况下运行此SQL命令时,具有相同选项的mysql.connector会正确处理该命令,并返回结果集,我可以处理该结果集,但我希望将结果写回表中 当我将插入添加到worklogs_聚合时,请从中选择Z.*。。。在SELECT语句中,除了SET部分,库不能正确执行它,我真的不明白为什么。 我没有收到任何错误消息。执行完成时没有任何错误,但表中没有显示任何内容。如果我复制同一个命令并尝试在DBeaver中执行它,它就可以完美地工作 我的简化Python代码与此类似:在python中,mysql.connector不使用multi标志执行insert into,python,mysql,sql,Python,Mysql,Sql,我有一点复杂的MySQL插入,它设置一些变量,连接一些表,聚合值,然后尝试插入到表中。当我尝试使用DBeaver执行时,这个sqlinsert命令可以工作 当我尝试在没有插入部分的情况下运行此SQL命令时,具有相同选项的mysql.connector会正确处理该命令,并返回结果集,我可以处理该结果集,但我希望将结果写回表中 当我将插入添加到worklogs_聚合时,请从中选择Z.*。。。在SELECT语句中,除了SET部分,库不能正确执行它,我真的不明白为什么。 我没有收到任何错误消息。执行完成
import mysql.connector
import config as cfg
def rds_db_connect_for_multi_statement():
token = aws_generate_db_auth_token()
config = {
'host': cfg.db_config['hostname'],
'port': cfg.db_config['port'],
'user': cfg.db_config['username'],
'password': token,
'database': cfg.db_config['database'],
'ssl_ca': cfg.db_config['ca_path'],
'charset': cfg.db_config['charset'],
'raise_on_warnings': True
}
return mysql.connector.connect( **config )
if __name__== "__main__":
connection = None
cursor = None
try:
connection = rds_db_connect_for_multi_statement()
cursor = connection.cursor(buffered=True)
LONG_SQL_COMMAND=... # the SQL command from below
cursor.execute(LONG_SQL_COMMAND, multi=True)
connection.commit()
cursor.close()
connection.close()
except Exception as e:
if(cursor):
cursor.close()
elif(connection):
connection.rollback()
connection.close()
else:
raise(e)
这在没有插入的情况下工作:
设置
@行号:=0,
@l_基准面:=“1900-01-01”,
@l_成员id:=0,
@l_项目\u sm_id:=0;
选择
资料
成员编号:,
项目编号:,
ts_电子邮件,
项目名称,
项目名称,
分配\u分配\u id,
分配项目id,
助理人力资源联系人id,
分配用户id,
持续时间
从…起
选择
@行号:=案例
当@l_基准=基准时
和@l_member_id=member_id
和@l_project_sm_id=project_sm_id
然后@row_编号+1
其他1
按项目订单结束,
@l_基准:=基准作为基准,
@l_member_id:=作为member_id的member_id,
@l_project_sm_id:=project_sm_id作为project_sm_id,
ts_电子邮件作为ts_电子邮件,
项目名称作为项目名称,
项目名称作为项目名称,
assignment\u assignment\u id作为assignment\u assignment\u id,
分配项目id作为分配项目id,
助理人力资源联系人id作为助理人力资源联系人id,
assignment\u user\u id作为assignment\u user\u id,
持续时间\小时作为持续时间\小时
从…起
选择
工作作为基准,
工作成员id作为成员id,
工作项目id作为项目sm id,
合并
LowerMap.ts_电子邮件,
电子邮件
作为ts_的电子邮件,
项目名称作为项目名称,
map.ts_项目名称作为项目名称,
asg.assignment\u id作为assignment\u assignment\u id,
asg.projekt_id作为assignment_projekt_id,
asg.hr\U联系人\U id作为助理\U hr\U联系人\U id,
asg.user\U id作为assigment\U user\U id,
(用熟石膏、木板等)装天花板
Sumu分钟/60
每小时
从…起
sm2ts.worklogs作为工作日志
以prj.id=wrk.project\U id上的prj身份加入sm2ts.ref\U项目
将sm2ts.project\u map作为map.sm\u id=wrk.project\u id上的map加入
将sm2ts.ref_成员作为mem.id=wrk.member_id上的mem左加入
左键将sm2ts.email\u映射为LowerMap.sm\u email=Lowermem.email上的emap
以asg的身份加入sm2ts.sf_作业,在Lowerasg.email=Coalesce
LowerMap.ts_电子邮件,
电子邮件
和lowersg.project\u name=Lowermap.ts\u project\u name
哪里
“2020-01-01”期间的工作时间
以及‘2020-02-06’
和map.sm_org_id='544411'
分组
工作成员身份证,
工作,
工程项目编号:,
map.sm_id,
合并
LowerMap.ts_电子邮件,
电子邮件
,
prj.name,
map.sm_名称,
map.ts_项目名称,
asg.I.U.id,
asg.projekt_id,
asg.hr\u联系人\u id,
asg.user\u id
订购人
工作成员身份证,
工作,
工程项目编号:,
map.sm_id,
合并
LowerMap.ts_电子邮件,
电子邮件
,
prj.name,
map.sm_名称,
map.ts_项目名称,
asg.I.U.id,
asg.projekt_id,
asg.hr\u联系人\u id,
asg.user\u id
X
Y
哪里
Y.project_order=1
订购人
资料
成员编号:,
项目名称;
这不适用于插入到:
设置
@行号:=0,
@l_基准面:=“1900-01-01”,
@l_成员id:=0,
@l_项目\u sm_id:=0;
插入到工作日志中
选择Z.*
从…起
选择
资料
成员编号:,
项目编号:,
ts_电子邮件,
项目名称,
项目名称,
分配\u分配\u id,
分配项目id,
助理人力资源联系人id,
分配用户id,
持续时间
从…起
选择
@行号:=案例
当@l_基准
=基准
和@l_member_id=member_id
和@l_project_sm_id=project_sm_id
然后@row_编号+1
其他1
按项目订单结束,
@l_基准:=基准作为基准,
@l_member_id:=作为member_id的member_id,
@l_project_sm_id:=project_sm_id作为project_sm_id,
ts_电子邮件作为ts_电子邮件,
项目名称作为项目名称,
项目名称作为项目名称,
assignment\u assignment\u id作为assignment\u assignment\u id,
分配项目id作为分配项目id,
助理人力资源联系人id作为助理人力资源联系人id,
assignment\u user\u id作为assignment\u user\u id,
持续时间\小时作为持续时间\小时
从…起
选择
工作作为基准,
工作成员id作为成员id,
工作项目id作为项目sm id,
合并
LowerMap.ts_电子邮件,
电子邮件
作为ts_的电子邮件,
项目名称作为项目名称,
map.ts_项目名称作为项目名称,
asg.ASSIGNMENT\u ID作为ASSIGNMENT\u ASSIGNMENT\u ID,
asg.PROJEKT_ID作为assignment_PROJEKT_ID,
asg.HR\U联系人\U ID作为助理\U HR\U联系人\U ID,
asg.USER\U ID作为assigment\U USER\U ID,
(用熟石膏、木板等)装天花板
Sumu分钟/60
每小时
从…起
sm2ts.worklogs作为工作日志
以prj.id=wrk.project\U id上的prj身份加入sm2ts.ref\U项目
将sm2ts.project\u map作为map.sm\u id=wrk.project\u id上的map加入
将sm2ts.ref_成员作为mem.id=wrk.member_id上的mem左加入
左键将sm2ts.email\u映射为LowerMap.sm\u email=LOWERmem.email上的emap
以asg的身份加入sm2ts.sf_作业,在LOWERasg.email=COALESCE
LowerMap.ts_电子邮件,
电子邮件
和lowersg.PROJECT\u NAME=LOWERmap.ts\u PROJECT\u NAME
哪里
“2020-01-01”期间的工作时间
以及‘2020-02-06’
和map.sm_org_id='544411'
分组
工作成员身份证,
工作,
工程项目编号:,
map.sm_id,
合并
LowerMap.ts_电子邮件,
电子邮件
,
prj.name,
map.sm_名称,
map.ts_项目名称,
asg.I.U.ID,
asg.PROJEKT_ID,
asg.HR\u联系人\u ID,
asg.USER\u ID
订购人
工作成员身份证,
工作,
工程项目编号:,
map.sm_id,
合并
LowerMap.ts_电子邮件,
电子邮件
,
prj.name,
map.sm_名称,
map.ts_项目名称,
asg.I.U.ID,
asg.PROJEKT_ID,
asg.HR\u联系人\u ID,
asg.USER\u ID
X
Y
哪里
Y.project_order=1
订购人
资料
成员编号:,
项目编号
Z
从Python执行插入时,是什么导致了问题?
为什么在使用DBeaver执行相同的SQL命令时没有出现任何错误?
如果没有引发异常,如何获取错误消息?
如果使用MySQL 8,您的生活会轻松得多,因为MySQL 8支持并主要消除@variables需求。请告知您使用的版本:选择版本;。可能该集合干扰了插入操作。请参阅此答案,这将使您的问题重复:@Parfait我使用的是较旧版本的MySQL,您的查询返回的版本号为:5.7。26@Parfait感谢您的想法,遗憾的是,这个解决方案并没有解决我的问题:for u in cursor.executeLONG_SQL_命令,multi=True:passTry to set或mysql.connector.connect…,autocommit=True,然后再运行循环。如果使用支持@variables的mysql 8,您的生活会轻松得多,而且大多数情况下不需要@variables。请告知您使用的版本:选择版本;。可能该集合干扰了插入操作。请参阅此答案,这将使您的问题重复:@Parfait我使用的是较旧版本的MySQL,您的查询返回的版本号为:5.7。26@Parfait感谢您的想法,遗憾的是,这个解决方案并没有解决我的问题:for u in cursor.executeLONG_SQL_命令,multi=True:passTry设置或mysql.connector.connect…,autocommit=True,然后再运行循环。