python - 使用 Python 将 CSV 数据写入两个 MYSQL 表

标签 python mysql csv

我需要从一个 csv 文件中获取数据并将其导入到同一数据库中的两个 mysql 表中。

CSV 文件:

username,password,path
FP_Baby,7tO0Oj/QjRSSs16,FP_Baby
lukebryan,uu00U62SKhO.sgE,lukebryan
saul,r320QdyLJEXKEsQ,saul
jencarlos,LOO07D5ZxpyzMAg,jencarlos
abepark,HUo0/XGUeJ28jaA,abepark

来自 CSV 文件

usernamepassword 进入 USERS 表 path 进入 VFS_PERMISSIONS 表

USERS 表看起来像

INSERT INTO `USERS` (`userid`, `username`, `password`, `server_group`) VALUES
(23, 'username', 'password', 'MainUsers'),

INSERT INTO `VFS_PERMISSIONS` (`userid`, `path`, `privs`) VALUES
(23, '/path/', '(read)(write)(view)(delete)(resume)(share)(slideshow)(rename)(makedir)(deletedir)'),

如果可能的话,我希望两个表中的用户标识都从 24 开始,并为 csv 中的每一行递增 +1。

到目前为止,我可以读取 csv 文件,但我不知道如何插入到两个 mysql 表中。

#!/usr/bin/env python
import csv
import sys
import MySQLdb
conn = MySQLdb.connect(host= "localhost",
                  user="crushlb",
                  passwd="password",
                  db="crushlb")

x = conn.cursor()

f = open(sys.argv[1], 'rt')
try:
    reader = csv.reader(f)
    for row in reader:

    ## mysql stuff goes here right?

finally:
    f.close()

最佳答案

您可以通过提前准备参数(在循环中)并在循环完成后调用 cursor.executemany 来减少对 cursor.execute 的调用次数:

cursor = conn.cursor()   
user_args = []
perm_args = []

perms = '(read)(write)(view)(delete)(resume)(share)(slideshow)(rename)(makedir)(deletedir)'

with open(sys.argv[1], 'rt') as f:
    for id, row in enumerate(csv.reader(f), start = 24):
        username, password, path = row
        user_args.append((id, username, password, 'MainUsers'))
        perm_args.append((id, path, perms))

insert_users = '''
    INSERT IGNORE INTO `USERS`
    (`userid`, `username`, `password`, `server_group`)
    VALUES (%s, %s, %s, %s)
    '''

insert_vfs_permissions = '''
    INSERT IGNORE INTO `VFS_PERMISSIONS`
    (`userid`, `path`, `privs`)
    VALUES (%s, %s, %s)
    '''

cursor.executemany(insert_users,user_args)
cursor.executemany(insert_vfs_permissions,perm_args)

INSERT IGNORE 告诉 MySQL 尝试向 MySQL 表中插入行,但如果存在冲突则忽略该命令。例如,如果 userid 是 PRIMARY KEY,并且已经有一行具有相同的 userid,则 INSERT IGNORE SQL 将忽略插入新行的命令,因为这将创建两行相同的主键。

如果没有 IGNOREcursor.executemany 命令将引发异常并且无法插入任何行。

我使用了 INSERT IGNORE,因此您可以多次运行代码而不会 cursor.executemany 引发异常。

还有一个 INSERT ... ON DUPLICATE KEY UPDATE 命令告诉 MySQL 尝试插入一行,但如果有冲突则更新它,但我会把它留在这里除非您想了解更多关于 ON DUPLICATE KEY 的信息。

关于python - 使用 Python 将 CSV 数据写入两个 MYSQL 表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8947147/

相关文章:

python - 流式传输大型 csv 文件的最快方法是什么?

python - 如何在 python 中将 pocketsphinx (5prealpha) 与 gstreamer-1.0 一起使用?

python - 二进制模式下 io.FileIO 和 open() 的区别

python - 在 Tk 小部件中显示标准输出

java - 无法理解我的 Spring DTO 的工作原理

mysql - 用于保存非常不同的小数位数的列类型

javascript - 从 csv 制作二维数组

python - 让Sublime在两个类似的构建系统中进行选择

mysql - 什么时候使用 INSERT IGNORE 好习惯?

python - Pandas DataFrame 读取跳过行 XXX : expected X fields, 看到 Y