从Python

时间:2015-11-11 19:19:29

标签: python json sqlite

我有一个名为'test'的表,我正在通过我的Python代码创建。

db = sqlite3.connect("mydb.db")
cur = db.cursor()
cur.execute('''CREATE TABLE IF NOT EXISTS test 
            (
                "id" text primary key,
                "field1" integer,
                "fiedl2" integer,
                "field3" text
            )'''
           )

我有一个文件,其中每一行都是json。我逐行读取文件,并将每行json中的数据插入表中。

file.txt的:

{'id':'abcde', 'field1': 10, 'field2': 20, 'field3': "hello"}
{'id':'asdf', 'field1': 20, 'field2': 5, 'field3': "world"}
{'id':'qwerty', 'field1': 1, 'field2': 2, 'field3': None}

如果json中的字段没有值,我想在我的sqlite表中插入null。所以在上面的最后一行中,如果field3没有值,我将None放入其中,因为这是我在其他相关问题中读到的内容。

但是,当我插入如下:

for line in readfile:
    line = ast.literal_eval(line)
    columns = '", "'.join([i.strip() for i in line.keys()])
    columns = "\"" + columns + '\"' 
    placeholders = ', '.join('?' * len(line))
    sql = 'INSERT INTO test ({}) VALUES ({})'.format(columns, placeholders)
    cur.execute(sql, ["'" + str(i) + "'" for i in line.values()])
    db.commit()

当我从Sqlite控制台执行select语句时,我得到'None'而不是null。

sqlite> select * from test where id='qwerty' limit 1;
'qwerty'|1|2|'None'|

任何人都可以帮我解决这个问题吗?我正在使用Python 3.4

1 个答案:

答案 0 :(得分:3)

您正在获取"None"字符串,因为您在将None传递给字符串之后将其传递给execute函数:

cur.execute(sql, ["'" + str(i) + "'" for i in line.values()])

因此,就python / sqlite而言,您需要插入字符串"None" - 而不是None对象。

execute函数中将参数作为第二个参数的意义在于,它应该为您执行value-to-sql-string表示。因此,您应该以其本机python数据类型提供值。

所以,使用

cur.execute(sql, list(line.values()))

实际上应该为您提供null而不是"None"