python - 快速 MySQL 导入

标签 python mysql python-3.3

编写一个脚本来转换原始数据以进行 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/

相关文章:

mysql - mysql 5.6 无法连接jdbc

python - Bash 别名 --> Python 2.7 到 Python 3.3

python - 如何按元素移动数据帧以填充 NaN?

mysql - 无法使用主目录中的 .my.cnf 从 Node.js 客户端连接到 MySql

python - 将 Numpy 结构化数组转换为 Pandas 数据帧

php - 简单的 MySQL 查询问题 - 获取相关记录,同时也获取不相关的记录

python - 无法为 Selenium 使用 chrome 驱动程序

python - 如何使 pyserial 环回工作?

java - 为什么从 Java 调用我的 Python 程序会失败?

python - 在 matplotlib 中将直线拟合到对数对数曲线