我需要从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文件
username
和password
进入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()
答案 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的两行。
如果没有IGNORE
,cursor.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))