python MySQL连接器多条语句

时间:2018-12-20 16:24:33

标签: python mysql

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中运行了该语句,以确保该语句有效并且可以工作。

在这里没有成功...

2 个答案:

答案 0 :(得分:0)

执行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

答案 1 :(得分:0)

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

我找到了 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')