3

我正在尝试将文本文件发送到 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()        
4

6 回答 6

6

我刚看到这篇旧帖子,但这些答案都没有解决我的问题。

我在这里看到有一个专用于 LOCAL DATA INFILE 的参数: allow_local_infile=True

所以可以这样做:

mysql.connector.connect(user='[username]', password='[pass]', host='[host]', allow_local_infile=True)
于 2019-03-20T10:31:19.040 回答
4

在 MySQLdb 中,我使用它来启用LOAD DATA LOCAL INFILE功能:

MySQLdb.connect(..., local_infile=True)
于 2013-05-04T04:19:33.477 回答
3

我也有类似的问题。我是 python 和 mysqldb 的新手。我添加了一个 conn.commit 并且它有效。似乎它通过要求提交来保护数据库。

于 2013-10-24T14:19:47.320 回答
1

您使用的是什么版本的 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',)]

请注意,您需要将 FILE 权限授予“测试”用户,例如,

GRANT FILE ON *.* TO 'test'@'localhost';
于 2013-09-05T14:38:41.927 回答
1

我在这里回答了同样的问题:https ://stackoverflow.com/a/25495823/2364773

简而言之,您需要使用 client_flags 参数在连接中添加客户端标志

于 2014-08-25T23:31:46.670 回答
1

我正在使用:
MySQL 服务器 8.0.25
mysql-connector-python 8.0.25
Python 3.8.10

@Maaz对这个问题的回答对我有用。我无法发表评论,所以我想我会发布一个答案以在此页面上显示活动。

在添加此参数会产生影响这一事实之后,我也挖掘了一点,尽管它不应该因为默认值应该allow_local_infile=True根据@abu和提供的链接

在快速深入了解 的构造函数后mysql.connector.connect,我发现默认值最终追溯到[python packages]\mysql\connector\constants.py,其中列出了许多参数的默认值,其中一个是'allow_local_infile': False.

我希望这可以帮助任何人在未来发现这个问题!:D

于 2021-07-20T07:23:30.663 回答