我需要从一个 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 开始,并为 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 将忽略插入新行的命令,因为这将创建两行相同的主键。
如果没有 IGNORE
,cursor.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/