在python中,mysql.connector不使用multi标志执行insert into

在python中,mysql.connector不使用multi标志执行insert into,python,mysql,sql,Python,Mysql,Sql,我有一点复杂的MySQL插入,它设置一些变量,连接一些表,聚合值,然后尝试插入到表中。当我尝试使用DBeaver执行时,这个sqlinsert命令可以工作 当我尝试在没有插入部分的情况下运行此SQL命令时,具有相同选项的mysql.connector会正确处理该命令,并返回结果集,我可以处理该结果集,但我希望将结果写回表中 当我将插入添加到worklogs_聚合时,请从中选择Z.*。。。在SELECT语句中,除了SET部分,库不能正确执行它,我真的不明白为什么。 我没有收到任何错误消息。执行完成

我有一点复杂的MySQL插入,它设置一些变量,连接一些表,聚合值,然后尝试插入到表中。当我尝试使用DBeaver执行时,这个sqlinsert命令可以工作

当我尝试在没有插入部分的情况下运行此SQL命令时,具有相同选项的mysql.connector会正确处理该命令,并返回结果集,我可以处理该结果集,但我希望将结果写回表中

当我将插入添加到worklogs_聚合时,请从中选择Z.*。。。在SELECT语句中,除了SET部分,库不能正确执行它,我真的不明白为什么。 我没有收到任何错误消息。执行完成时没有任何错误,但表中没有显示任何内容。如果我复制同一个命令并尝试在DBeaver中执行它,它就可以完美地工作

我的简化Python代码与此类似:

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,然后再运行循环。