2010-08-26 52 views
0

我正在玩Python 3的sqlite3模塊,並熟悉了SQL。SQL以「動態類型」方式處理表更新

我已經寫了一個玩具程序來散列醃製密碼,並將它,相關用戶名和鹽存儲到數據庫中。我認爲這將是直觀的創建簽名的功能:

def store(table, data, database=':memory:') 

可贖回,例如,store('logins', {'username': 'bob', 'salt': 'foo', 'salted_hash' : 'bar'}),並能夠單獨爲username加入到logins,進入新的一排,價值bobfoo對於salt,et caetera。

不幸的是我用什麼SQL來編碼。我試圖以「動態類型」的方式做到這一點,例如,我不會因爲存儲錯誤的類型而受到懲罰,或者可以隨意添加新的列。

我想要的功能,消毒所有輸入:

  • 檢查表存在,如果沒有,從字典中的列所傳遞的密鑰,來創建它;
  • 如果表已經存在,檢查一個表是否有指定的列(對傳入字典的鍵),如果沒有,就添加它們(這甚至可能用SQL?);
  • 將我的字典中的各個值添加到字典中的相應列。

我可以使用INSERT爲後者,但它似乎非常嚴格。例如,如果列不存在會發生什麼?我們如何添加它們?

我不介意代碼是爲Python 3的sqlite3定製的,還是隻是SQL作爲大綱;只要我能夠在一定程度上使用它(並從中吸取教訓),我非常感激。 (在不同的說明中,我想知道我可以使用什麼其他方法來代替SQL'd關係數據庫;我之前使用過亞馬遜的SimpleDB,並已考慮將其用於此目的,因爲它是 「動態類型」,但我想知道我不得不爲此使用什麼SQL代碼。)

+1

你有沒有使用一個完全成熟的ORM考慮? SQLAlchemy(http://www.sqlalchemy。org /)非常時髦 – carl 2010-08-26 16:43:28

+0

如果你想要一個完全的無模式/動態體驗,像sqlite這樣的rdbms並不是正確的選擇。 – TTT 2010-08-26 23:20:12

回答

1
  1. sqlite3的是動態類型的,所以沒有問題。

  2. CREATE TABLE IF NOT EXISTS <name> ...here.

  3. 你可以看到,如果在表中存在使用sqlite_masterthis FAQ.記錄你需要已經列你需要解析sql列,但因爲它是你的程序提供什麼要創建表格,你應該知道語法。

  4. 如果列不存在,你可以ALTER TABLE <nam>? ADD COLUMN ...here.

相關問題