我正在尝试将文本文件发送到MySQL数据库。我试图用python 3.2中的mysql连接器做到这一点。问题是关于LOAD DATA INFILE语法。你可以在上面找到我的代码。我的第一个问题是无论如何要解决这个问题。请注意,我已尝试使用local-infile = 1选项,Python不允许此选项。第二,有没有其他方法可以将这些数据作为一个块发送到mysql数据库中?
from __future__ import print_function
import os
import mysql.connector
from mysql.connector import errorcode
config = {
'user':'root',
'password':'3778',
## 'host':'localhost',
# 'database':'microstructure',
# 'local-infile':'1',
}
DB_NAME = 'EURUSD'
TABLES ={}
TABLES['microstructure']=(
"CREATE TABLE `microstructure` ("
# " `p_id` int NOT NULL AUTO_INCREMENT,"
" `ticker` varchar(255),"
" `time` date,"
" `last_price` decimal(6,3)"
") ENGINE=InnoDB")
TABLES['cumulative']=(
"CREATE TABLE `cumulative` ("
" `p_id` int NOT NULL AUTO_INCREMENT,"
" `ticker` varchar(255),"
" `time` date,"
" `last_price` decimal(6,3),"
" PRIMARY KEY(`p_id`)"
") ENGINE=InnoDB")
cnx = mysql.connector.connect(**config)
cursor = cnx.cursor()
path_txt = 'C:/Users/ibrahim/Desktop/testfile.txt'
def create_database(cursor):
try:
cursor.execute(
"CREATE DATABASE IF NOT EXISTS {} DEFAULT CHARACTER SET 'utf8'".format(DB_NAME))
except mysql.connector.Error as err:
print("Failed creating database: {}".format(err))
exit(1)
try:
cnx.database = DB_NAME
except mysql.connector.Error as err:
if err.errno == errorcode.ER_BAD_DB_ERROR:
create_database(cursor)
cnx.database=DB_NAME
else:
print(err)
exit(1)
for name, ddl in TABLES.items():
try:
print("Creating table {}: ".format(name), end ='')
cursor.execute(ddl)
except mysql.connector.Error as err:
if err.errno == errorcode.ER_TABLE_EXISTS_ERROR:
print("Already exists")
else:
print(err)
else:
print("OK")
cursor.execute("SET @@global.local_infile = 1")
cursor.execute("LOAD DATA LOCAL INFILE 'testfile.txt' into table microstructure")
os.system("start")
cursor.close()
答案 0 :(得分:3)
我也有类似的问题。我是python和mysqldb的新手。我添加了一个conn.commit,它有效。 它似乎通过要求提交来保护数据库。
答案 1 :(得分:1)
在MySQLdb中,我使用它来启用LOAD DATA LOCAL INFILE
功能:
MySQLdb.connect(..., local_infile=True)
答案 2 :(得分:1)
我在这里回答了同样的问题:https://stackoverflow.com/a/25495823/2364773
简而言之,您需要使用client_flags参数
在连接中添加客户端标志答案 3 :(得分:1)
我正在使用:
MySQL 服务器 8.0.25
mysql-connector-python 8.0.25
Python 3.8.10
@Maaz 对这个问题的回答对我有用。我无法发表评论,所以我想我会发布一个答案来显示此页面上的活动。
在添加这个参数会产生不同的事实之后,我也挖掘了一点,尽管它不应该是因为默认值应该是 allow_local_infile=True
根据 @abu 和提供的 link。
在快速深入了解 mysql.connector.connect
的构造函数后,我发现默认值最终追溯到 [python packages]\mysql\connector\constants.py
,其中列出了许多参数的默认值,其中一个是 {{1} }.
我希望这有助于将来发现此问题的任何人! :D
答案 4 :(得分:0)
您使用的是哪个版本的mysql.connector?我在1.0.11上,我的功能正常运行。我做的是用三行(1,2,3)创建data.txt,cd进入它,启动python 3.3.1,然后运行:
import mysql.connector
conn = mysql.connector.connect(database='test', user='test', password='xx')
curs = conn.cursor()
curs.execute('''CREATE TABLE foo (id text)''')
curs.execute('''LOAD DATA INFILE '/<full path to>/data.txt' INTO TABLE foo''')
curs.execute('''SELECT * FROM FOO''')
print(curs.fetchall())
curs.execute('''DROP TABLE foo''')
我的输出:
[('1',),('2',),('3',)]
请注意,您需要向'test'用户授予FILE权限,例如,
GRANT FILE ON *.* TO 'test'@'localhost';
答案 5 :(得分:0)
我刚刚看到了这个旧帖子,但是这些答案都没有解决我的问题。
我看到here有一个专门用于LOCAL DATA INFILE的参数:
allow_local_infile=True
因此可以这样做:
mysql.connector.connect(user='[username]', password='[pass]', host='[host]', allow_local_infile=True)