如何使用csv文件中的文件名作为sqlite中的表名?

时间:2014-07-29 12:07:02

标签: python sql sqlite csv

我尝试使用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)

1 个答案:

答案 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注入攻击持开放态度。