我想克隆 MariaDB 中的一个表。当我在命令行登录 MariaDB 时,这个命令工作正常:
MariaDB [my_dbase]> CREATE TABLE new_table AS SELECT * FROM existing_table;
...结构和数据都被克隆。
但是当我通过此命令使用 mariadb Python 模块时
cursor.execute('CREATE TABLE new_table AS SELECT * FROM existing_table')
...没有引发异常,并且使用正确的结构创建了表...但是新表有 0 行数据。
有人能解释一下吗?是否可以使用 mariadb Python 模块来克隆表,包括数据?
您遇到的问题似乎与
mariadb
Python 模块处理查询的方式有关,特别是通过 Python 执行命令时可能处于活动状态的 SQL 模式。
使用
mariadb
Python 模块时,默认情况下可能会强制执行某些 SQL 模式,而当您通过命令行直接与 MariaDB 交互时,这些模式不会处于活动状态。具体来说,NO_AUTO_VALUE_ON_ZERO
或类似的 SQL 模式可能会导致 CREATE TABLE ... AS SELECT ...
查询的行为不同,从而导致生成没有数据的新表。这可能不会触发异常,但会默默地导致空表。
为了确保 SQL 模式一致并且查询行为符合预期,您可以在 Python 脚本中显式设置 SQL 模式或禁用任何可能干扰的模式。具体方法如下:
import mariadb
# Connect to MariaDB
conn = mariadb.connect(
user="your_username",
password="your_password",
host="localhost",
database="my_dbase"
)
# Create a cursor object
cursor = conn.cursor()
# Optional: Set the SQL mode to empty or to a specific mode that works for your query
cursor.execute("SET sql_mode = '';")
# Execute the query to clone the table
cursor.execute('CREATE TABLE new_table AS SELECT * FROM existing_table')
# Commit the changes
conn.commit()
# Check if the data has been copied
cursor.execute('SELECT COUNT(*) FROM new_table')
row_count = cursor.fetchone()[0]
print(f"Number of rows in new_table: {row_count}")
# Close the connection
cursor.close()
conn.close()
conn.commit()
提交事务。这应该允许您使用
mariadb
Python 模块克隆结构和数据完整的表。