编写一个脚本来转换MySQL导入的原始数据我到目前为止使用了一个临时文本文件,后来我使用LOAD DATA INFILE ...命令手动导入。
现在我将import命令包含在python脚本中:
db = mysql.connector.connect(user='root', password='root',
host='localhost',
database='myDB')
cursor = db.cursor()
query = """
LOAD DATA INFILE 'temp.txt' INTO TABLE myDB.values
FIELDS TERMINATED BY ',' LINES TERMINATED BY ';';
"""
cursor.execute(query)
cursor.close()
db.commit()
db.close()
这有效,但temp.txt必须位于数据库目录中,不适合我的需要。
下一个approch正在转储文件并直接提交:
db = mysql.connector.connect(user='root', password='root',
host='localhost',
database='myDB')
sql = "INSERT INTO values(`timestamp`,`id`,`value`,`status`) VALUES(%s,%s,%s,%s)"
cursor=db.cursor()
for line in lines:
mode, year, julian, time, *values = line.split(",")
del values[5]
date = datetime.strptime(year+julian, "%Y%j").strftime("%Y-%m-%d")
time = datetime.strptime(time.rjust(4, "0"), "%H%M" ).strftime("%H:%M:%S")
timestamp = "%s %s" % (date, time)
for i, value in enumerate(values[:20], 1):
args = (timestamp,str(i+28),value, mode)
cursor.execute(sql,args)
db.commit()
同样适用,但需要大约四倍的时间,这太多了。 (在第一个版本中使用了相同的构造来生成temp.txt)
我的结论是我需要一个文件和LOAD DATA INFILE命令更快。要在文本文件放置的地方自由,LOCAL选项似乎很有用。但是使用MySQL Connector(1.1.7)存在已知错误: mysql.connector.errors.ProgrammingError:1148(42000):此MySQL版本不允许使用该命令
到目前为止,我已经看到使用MySQLdb而不是MySQL Connector可以解决这个问题。然而,MySQLdb上的活动似乎很少,Python 3.3支持可能永远不会出现。
LOAD DATA LOCAL INFILE是否可行?如果有的话,是否有可用的python 3.3工作连接器?
编辑:开发后,数据库将在服务器上运行,客户端上的脚本。
答案 0 :(得分:2)
我可能错过了一些重要的内容,但是你不能在第一段代码中指定完整的文件名吗?
LOAD DATA INFILE '/full/path/to/temp.txt'
请注意,路径必须是服务器上的路径。
答案 1 :(得分:0)
要对每个可访问文件使用LOAD DATA INFILE
,您必须设置
创建连接时LOCAL_FILES
客户端标志
import mysql.connector
from mysql.connector.constants import ClientFlag
db = mysql.connector.connect(client_flags=[ClientFlag.LOCAL_FILES], <other arguments>)