编写一个脚本来转换原始数据以进行 MySQL 导入,到目前为止,我使用了一个临时文本文件,后来我使用 LOAD DATA INFILE... 命令手动导入该文件。
现在我将导入命令包含到 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 必须位于数据库目录中,这不适合我的需求。
下一步是转储文件并直接提交:
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()
效果也不错,但需要大约四倍的时间,这太多了。 (第一个版本中使用了相同的 for 构造来生成 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 的可用连接器?
编辑:开发后,数据库将在服务器上运行,脚本在客户端上运行。
最佳答案
我可能错过了一些重要的东西,但是你不能在第一段代码中指定完整的文件名吗?
LOAD DATA INFILE '/full/path/to/temp.txt'
注意路径必须是服务器上的路径。
关于python - 快速 MySQL 导入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23763229/