使用Python将CSV数据传输到两个MYSQL表

时间:2012-01-20 19:58:56

标签: 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处的两个表中启动userid,并在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()

2 个答案:

答案 0 :(得分:2)

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

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将忽略插入新行的命令,因为这将创建具有相同PRIMARY KEY的两行。

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

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

还有一个INSERT ... ON DUPLICATE KEY UPDATE命令告诉MySQL尝试插入一行,但是如果存在冲突则更新它,但除非你想了解更多关于{{1的信息,否则我会留下它}}

答案 1 :(得分:0)

由于您已经知道要执行的sql语句,因此使用cursor.execute方法应该更加或更简单:

offset = 23
for row_number, row in enumerate(reader):
    username, password, path = row
    x.execute("INSERT INTO `USERS` (`userid`, `username`, `password`, `server_group`) "
              "VALUES (%s, %s, %s, 'MainUsers')", (row_number+offset, username, password))
    x.execute("INSERT INTO `VFS_PERMISSIONS` (`userid`, `path`, `privs`) "
              "VALUES (%s, %s, '(read)(write)(view)(delete)(resume)(share)(slideshow)(rename)(makedir)(deletedir)'", (row_number+offset, path))