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

4

MySQLdb では、これを使用してLOAD DATA LOCAL INFILE機能を有効にします。

MySQLdb.connect(..., local_infile=True)
于 2013-05-04T04:19:33.477 に答える
1

どのバージョンの mysql.connector を使用していますか? 私は 1.0.11 を使用していますが、この機能は動作しています。私がしたことは、3行(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';
于 2013-09-05T14:38:41.927 に答える