2015-11-11 46 views
1

我有一個名爲'test'的表,我通過Python代碼創建。從Python中插入null到Sqlite中

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表。因此,如上面最後一行所示,如果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語句。

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

任何人都可以請幫我解決這個問題嗎?我使用Python 3.4

+0

您是否考慮過測試值是否爲「無」? –

回答

3

你得到一個"None"字符串,因爲你轉換None成一個字符串它傳遞給execute函數之前:

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

所以,只要蟒蛇/ sqlite的問題,你插入字符串"None" - 而不是None對象。

execute函數中將參數作爲第二個參數的一點是,它應該爲您執行值到sql字符串的表示。因此,你應該在他們的本地python數據類型中提供這些值。

因此,使用

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

實際上應該給你一個null而不是"None"

+0

完美的作品!我不得不使用cur.execute(sql,list(line.values()),雖然 – SanjanaS801

+0

正確 - 這是因爲你使用python3,其中的值作爲迭代器返回 - 我錯過了。 – sebastian