【问题标题】:MySQL Connector in Python does not allow LOAD DATA INFILE SyntaxPython 中的 MySQL 连接器不允许 LOAD DATA INFILE 语法
【发布时间】:2013-02-20 09:52:32
【问题描述】:

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

【问题讨论】:

    标签: python mysql-python


    【解决方案1】:

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

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

    所以可以这样做:

    mysql.connector.connect(user='[username]', password='[pass]', host='[host]', allow_local_infile=True)
    

    【讨论】:

    • 这不应该是必要的:同一个链接明确指出 allow_local_infile 参数的 default 值已经是 True
    【解决方案2】:

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

    MySQLdb.connect(..., local_infile=True)
    

    【讨论】:

    • 还有。不要忘记在 db 上执行 commit()。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

          【解决方案6】:

          我正在使用:
          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,其中列出了许多参数的默认值,其中一个是'allow_local_infile': False

          我希望这对以后发现此问题的任何人有所帮助! :D

          【讨论】:

            猜你喜欢
            • 2019-05-13
            • 1970-01-01
            • 2012-10-05
            • 1970-01-01
            • 2013-10-09
            • 1970-01-01
            • 1970-01-01
            • 2010-11-16
            • 1970-01-01
            相关资源
            最近更新 更多