【问题标题】:python mysql connector multiple statementspython mysql连接器多个语句
【发布时间】:2018-12-20 16:24:33
【问题描述】:
import mysql.connector

connection = mysql.connector.connect(user="REMOVED", 
                                     password="REMOVED", 
                                     host="REMOVED", 
                                     database="REMOVED")

cur = connection.cursor()

# Latitude - remove letter A
cur.execute("UPDATE tau._inm_exportados_test_csv SET latitud = REPLACE (latitud, 'a=','');")
print("Latitude change remove letter A - executed!")

# Longitude - remove letter A
cur.execute("UPDATE tau._inm_exportados_test_csv SET longitud = REPLACE (longitud, 'a=','');")
print("Longitude change remove letter A - executed!")

# Latitude - MODIFY COLUMN
cur.execute("ALTER TABLE tau._inm_exportados_test_csv MODIFY COLUMN latitud DECIMAL(10,6);")
print("Latitude - MODIFY COLUMN - executed!")

# Longitude - MODIFY COLUMN
cur.execute("ALTER TABLE tau._inm_exportados_test_csv MODIFY COLUMN longitud DECIMAL(10,6);")
print("Longitude - MODIFY COLUMN - executed!")




# Post Code data type change
cur.execute("ALTER TABLE tau._inm_exportados_test_csv MODIFY COLUMN codigo_postal varchar(255);)")
print("Post Code data type change to varchar(255) - executed!")

connection.commit()
cur.close()
connection.close()

我试图让这个简单的语句列表工作但没有成功。更令人困惑的是,前四个语句有效,而最后一个即使我注释掉其余语句也不起作用!最后的语句得到以下响应:

mysql.connector.errors.InterfaceError:执行多条语句时使用multi=True

codigo_postal 的数据类型是 int(11),而纬度和经度是 varchar。

我尝试过创建新连接、新游标、新连接和游标。我尝试添加 multi="True" 并将语句组合到一个操作中。我尝试将 multi="True" 添加到每个 cur.execute() 作为第二个和第三个参数。我已在 Workbench 中运行该语句,以确保该语句有效且有效。

虽然在这里没有成功......

【问题讨论】:

  • 它的 multi=True 不是 multi="True"
  • 我的描述有误。我确实写了它的 multi=True 而不是 multi="True"。我刚刚注意到实际上有一个错字 - 在最后陈述的末尾有一个不需要的括号!我刚刚重新运行代码并且它正在工作。感谢您的意见。

标签: python mysql


【解决方案1】:

您可以在执行 DML(数据操作语言)命令后使用commit。同样使用multi=True 可以更方便地完成这项工作,但您需要运行execute 创建的生成器。 doc.

普通方法:

cur = connection.cursor()

def alter(state,msg):
    try:
        cur.execute(state)
        connection.commit()     
    except Exception as e:
        connection.rollback()
        raise e
    print(msg)

alter("ALTER TABLE address MODIFY COLUMN id int(15);","done")
alter("ALTER TABLE address MODIFY COLUMN email varchar(35);","done")
alter("ALTER TABLE address MODIFY COLUMN person_id int(35);","done")

multi=True:

cur = connection.cursor()

def alter(state,msg):
    result = cur.execute(state,multi=True)
    result.send(None)
    print(msg,result)
try:
    alter("ALTER TABLE address MODIFY COLUMN id int(45)","done")
    alter("ALTER TABLE address MODIFY COLUMN email varchar(25)","done")
    alter("ALTER TABLE address MODIFY COLUMN person_id int(25);","done")
    connection.commit()
except Exception as e:
    connection.rollback()
    raise e

【讨论】:

  • 太好了,我刚刚实现了
【解决方案2】:

我遇到了同样的问题。 我希望我的代码是干净的,我希望将我的所有命令放在一个列表中,然后按顺序运行它们。

我找到了this linkthis link,终于可以写出这段代码了:

import mysql.connector as sql
from mysql.connector import Error
        
commands = [
    '''
    USE sakila;
    SELECT * FROM actor;
    ''',
    '''
    USE sakila;
    SELECT * FROM actor WHERE actor_id < 10;
    '''
]  

connection_config_dict = {
    'user': 'username',
    'password': 'password',
    'host': '127.0.0.1',
}

try:
    connection = sql.connect(**connection_config_dict)
    if connection.is_connected():
        db_Info = connection.get_server_info()
        print("Connected to MySQL Server version ", db_Info, '\n')
        cursor = connection.cursor()
        
        for command in commands:
            for result in cursor.execute(command, multi=True):
                if result.with_rows:
                    print("Rows produced by statement '{}':".format(
                    result.statement))
                    print(result.fetchall())
                else:
                    print("Number of rows affected by statement '{}': {}".format(
                    result.statement, result.rowcount), '\n')
        record = cursor.fetchall()
        
except Error as e:
    print("Error while connecting to MySQL", e, '\n')

finally:
    if connection.is_connected():
        cursor.close()
        connection.close()
        print("MySQL connection is closed", '\n')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-02
    • 2011-09-18
    • 1970-01-01
    • 1970-01-01
    • 2022-11-06
    • 2014-01-14
    • 2011-12-13
    • 1970-01-01
    相关资源
    最近更新 更多