【问题标题】:How to use filenames from csv-files as table names in sqlite?如何使用 csv 文件中的文件名作为 sqlite 中的表名?
【发布时间】:2014-07-29 12:07:02
【问题描述】:

我正在尝试使用 python 将八个 csv 文件作为单独的表导入到 sqlite 数据库中。数据库表的名称应与 csv 文件的名称相同(减去 .csv 扩展名)。如何创建与 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)

【问题讨论】:

  • CREATE TABLE 语句有效吗?
  • @Tichodroma 我得到一个 sqlite3.OperationalError: near "?"在 CREATE TABLE 语句中

标签: python sql sqlite csv


【解决方案1】:

您不能使用表名作为查询参数;这是使用 SQL 参数的要点之一,防止数据被解释为对象名称。

您必须在此处使用字符串插值:

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 注入攻击。

【讨论】:

  • 谢谢,这成功了!我想因为我们使用 python 2.6.6 我得到了一个ValueError: zero length field name in format,但是像这样"{0}""{}" 中插入一个零似乎可以摆脱这个错误。
  • @Håvard:确实;我一直忘记添加索引,因为它们在 2.7 及更高版本中是多余的。
猜你喜欢
  • 2020-12-03
  • 2014-06-01
  • 2013-08-21
  • 1970-01-01
  • 2020-12-31
  • 1970-01-01
  • 2012-05-20
  • 2020-04-19
  • 1970-01-01
相关资源
最近更新 更多