MariaDB Python 模块似乎无法正确执行 CREATE TABLE AS

问题描述 投票:0回答:1

我想克隆 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 行数据。

  • 操作系统是W10,Python 3.10.5
  • Mariadb:“版本 15.1 Distrib 10.7.3-MariaDB,适用于 Win64 (AMD64)”
  • mariadb Python 模块是 1.1.10

有人能解释一下吗?是否可以使用 mariadb Python 模块来克隆表,包括数据?

python mysql mariadb clone
1个回答
0
投票

您遇到的问题似乎与

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()

要点:

  1. SQL 模式调整:显式设置 SQL 模式以确保 Python 环境的行为与命令行环境类似。
  2. 提交更改:确保在执行查询后使用
    conn.commit()
    提交事务。

这应该允许您使用

mariadb
Python 模块克隆结构和数据完整的表。

© www.soinside.com 2019 - 2024. All rights reserved.