我尝试使用python将8个csv文件作为单独的表导入sqlite数据库。数据库表的名称应与csv文件的名称相同(减去.csv-extension)。如何创建与csv文件同名的表,以及如何在正确的数据库表中插入数据?
这是我尝试编码的原因。导入语句,UnicodeDictReader函数和与数据库的连接被省略。
filmappe = '../csv'
for csvfile in os.listdir(filmappe):
with open(os.path.join(filmappe, csvfile), 'rb') as fil:
spamreader = UnicodeDictReader(fil)
t = (csvfile[:-4],)
to_db = [(i['fnr'], i['kjonn'], i['landbakgrunn'], i['alder'], i['arbkomm'], i['naring']) for i in spamreader]
cur.execute("CREATE TABLE IF NOT EXISTS ? (fnr, kjonn, landbakgrunn, alder, arbkomm, naring);", t )
cur.executemany("INSERT OR IGNORE INTO ? (fnr, kjonn, landbakgrunn, alder, arbkomm, naring) VALUES (?,?,?,?,?,?);",t, to_db)
答案 0 :(得分:2)
您不能将tablename用作查询参数;这是使用SQL参数的 points 之一,防止该数据被解释为对象名。
你必须在这里使用字符串插值:
cur.execute("""
CREATE TABLE IF NOT EXISTS "{}"
(fnr, kjonn, landbakgrunn, alder, arbkomm, naring)
""".format(t))
cur.executemany("""
INSERT OR IGNORE INTO "{}" (fnr, kjonn, landbakgrunn, alder, arbkomm, naring)
VALUES (?,?,?,?,?,?)
""".format(t), to_db)
我在表名周围添加了"
引号,以确保仍然可以使用也是关键字的名称。
不使用用户提供的数据执行此操作;如果您不能信任文件名,那么您对SQL注入攻击持开放态度。