python - mysql.connector 和常规 MySQL 中的精确查询不返回相同的结果

标签 python mysql

我想将以下文件从本地服务器加载到远程服务器上的数据库中:

/Users/user/Documents/test.csv:

a,b,c
1,2,3
4,5,6

我有以下声明:

drop table if exists myschema.remote_test_tb;

create table myschema.remote_test_tb (
    a int,
    b int,
    c int
);

load data local infile '/Users/user/Documents/test.csv'
    into table myschema.remote_test_tb
    fields terminated by ','
    enclosed by '\"'
    lines terminated by '\n'
    ignore 1 lines (a,b,c);

select * from myschema.remote_test_tb;

我需要在 Python mysql.connector 模块中运行这些相同的语句:

import mysql.connector

conn = mysql.connector.connect(
    database='myschema',
    user='myschema_own',
    password='xyz',
    host='MYHOST',
    port=3306,
    allow_local_infile=True
)
cursor = conn.cursor(dictionary=True)

cursor.execute(
    """
drop table if exists myschema.remote_test_tb;

create table myschema.remote_test_tb (
    a int,
    b int,
    c int
);

load data local infile '/Users/user/Documents/test.csv'
    into table myschema.remote_test_tb
    fields terminated by ','
    enclosed by '\"'
    lines terminated by '\n'
    ignore 1 lines (a,b,c);
    """
)
cursor.close()

print('success')

conn = mysql.connector.connect(
    database='myschema',
    user='myschema_own',
    password='xyz',
    host='MYHOST',
    port=3306,
    allow_local_infile=True
)
cursor = conn.cursor(dictionary=True)

cursor.execute('select * from myschema.remote_test_tb;')
records = cursor.fetchall()
cursor.close()

print(records)

虽然上面的原始 SQL 查询返回表中的非空记录,但 Python 尝试不返回任何内容:

$ python3 test.py 
success
[]

由于某种原因,load data 语句似乎在 Python 尝试中执行,但实际上并未插入记录。

有什么想法吗?

最佳答案

我使用sqlalchemypandas解决了这个问题:

import mysql.connector
from mysql.connector.constants import ClientFlag
from sqlalchemy import create_engine
import pandas as pd

DATABASE = 'DB'
USER = 'USER'
PASSWORD = 'PASS'
HOST = 'HOST'
TABLE='TB'
LOCALHOST_USER='USER'

def setup_connection():
    conn = mysql.connector.connect(
        database=DATABASE,
        user=USER,
        password=PASSWORD,
        host=HOST,
        port=3306,
        allow_local_infile=1,
        autocommit=True,
        client_flags=[ClientFlag.LOCAL_FILES]
    )
    cursor = conn.cursor(dictionary=True)
    return conn, cursor

conn, cursor = setup_connection()

connection_string = f'mysql+mysqlconnector://{USER}:{PASSWORD}@{HOST}/{DATABASE}'
mysql_engine = create_engine(connection_string)

cursor.execute(
    f"""
        drop table if exists {DATABASE}.{TABLE};

        create table {DATABASE}.{TABLE} (
            a int,
            b int,
            c int
        );
    """
)

df = pd.read_csv(f'/Users/{LOCALHOST_USER}/Documents/tmp/test.csv')
df.to_sql(con=mysql_engine, name=TABLE, schema=DATABASE, if_exists='replace', index=False)

cursor.close()
conn.close()

关于python - mysql.connector 和常规 MySQL 中的精确查询不返回相同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59160576/

相关文章:

python - 打乱单词的字符,同时保持句子结构和标点符号

python - 如何使用 OpenCV2.0 和 Python2.6 调整图像大小

python - 为什么我的 Python NumPy 代码比 C++ 更快?

mysql - 删除查询错误: Every derived table must have its own alias

mysql - 如何在 mysql 的另一个表中编辑唯一列引用作为外键?

python - Python use re 中如何匹配这种字符串?

python - TensorFlow:形状错误

sql - MySQL 选择查询,从动态生成的列中选择位置

mysql - SQL 查询中的多个 WHERE 子句

mysql - 如何存储sql表的图形