我想将以下文件从本地服务器加载到远程服务器上的数据库中:
/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 尝试中执行,但实际上并未插入记录。
有什么想法吗?
最佳答案
我使用sqlalchemy
和pandas
解决了这个问题:
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/