一時疏乎,同一個 cursor.execute 下了 2個 sql command 就出錯了。
除了可以分成 2 次下 cursor.execute() 也可以在 cursor.execute 時增加 multi=True 參數。

合在一起下的 example:
Using a for loop at cursor.execute with multi=True worked. I don’t know why we need to loop through.
for result in cursor.execute(SQL, multi=True):
pass
Without loop just cursor.execute(SQL, multi=True) did not do any changes in the database.
import mysql.connector
cnx = mysql.connector.connect(user='scott', database='test')
cursor = cnx.cursor()
SQL = '''
update my_table
set
LAY = 'P6682'
, BLK = 'P6682'
, ANI = 'P6682'
where
Shot = 'SH01';
update my_table
set
LAY = '1863'
, BLK = '1863'
, ANI = '1863'
where
Shot = 'SH02'
'''
for result in cursor.execute(SQL, multi=True):
pass
cnx.commit()
cur.close()
cnx.close()
cnx.disconnect()
from:
https://stackoverflow.com/questions/15288594/update-database-with-multiple-sql-statments
PS: multi=True is not necessary in a loop.
認識所有的參數:
Connector/Python Connection Arguments
https://dev.mysql.com/doc/connector-python/en/connector-python-connectargs.html
Table 7.1 Connection Arguments for Connector/Python
| Argument Name | Default | Description |
|---|---|---|
| user (username*) | The user name used to authenticate with the MySQL server. | |
| password (passwd*) | The password to authenticate the user with the MySQL server. | |
| database (db*) | The database name to use when connecting with the MySQL server. | |
| host | 127.0.0.1 | The host name or IP address of the MySQL server. |
| port | 3306 | The TCP/IP port of the MySQL server. Must be an integer. |
| unix_socket | The location of the Unix socket file. | |
| auth_plugin | Authentication plugin to use. Added in 1.2.1. | |
| use_unicode | True | Whether to use Unicode. |
| charset | utf8 | Which MySQL character set to use. |
| collation | utf8_general_ci | Which MySQL collation to use. |
| autocommit | False | Whether to autocommit transactions. |
| time_zone | Set the time_zone session variable at connection time. | |
| sql_mode | Set the sql_mode session variable at connection time. | |
| get_warnings | False | Whether to fetch warnings. |
| raise_on_warnings | False | Whether to raise an exception on warnings. |
| connection_timeout | Timeout for the TCP and Unix socket connections. | |
| client_flags | MySQL client flags. | |
| buffered | False | Whether cursor objects fetch the results immediately after executing queries. |
| raw | False | Whether MySQL results are returned as is, rather than converted to Python types. |
| consume_results | False | Whether to automatically read result sets. |
| ssl_ca | File containing the SSL certificate authority. | |
| ssl_cert | File containing the SSL certificate file. | |
| ssl_key | File containing the SSL key. | |
| ssl_verify_cert | False | When set to True, checks the server certificate against the certificate file specified by the ssl_ca option. Any mismatch causes a ValueError exception. |
| force_ipv6 | False | When set to True, uses IPv6 when an address resolves to both IPv4 and IPv6. By default, IPv4 is used in such cases. |
| dsn | Not supported (raises NotSupportedError when used). | |
| pool_name | Connection pool name. Added in 1.1.1. | |
| pool_size | 5 | Connection pool size. Added in 1.1.1. |
| pool_reset_session | True | Whether to reset session variables when connection is returned to pool. Added in 1.1.5. |
| compress | False | Whether to use compressed client/server protocol. Added in 1.1.2. |
| converter_class | Converter class to use. Added in 1.1.2. | |
| failover | Server failover sequence. Added in 1.2.1. | |
| option_files | Which option files to read. Added in 2.0.0. | |
| option_groups | [‘client’, ‘connector_python’] | Which groups to read from option files. Added in 2.0.0. |
| allow_local_infile | True | Whether to enable LOAD DATA LOCAL INFILE. Added in 2.0.0. |
| use_pure | True | Whether to use pure Python or C Extension. Added in 2.1.1. |
This solved my issue:
for result in cursor.execute(SQL, multi=True):
pass
Not sure why it needed the loop, I was able to get it to work without the loop a couple times but it wasn’t consistently working.
Thank you
loop is not necessary.