SQL以“动态类型”方式处理表更新

时间:2010-08-26 16:37:43

标签: python sql sqlite python-3.x

我正在玩Python 3的sqlite3模块,并在此过程中熟悉SQL。

我编写了一个玩具程序来散列盐渍密码并将其存储,相关的用户名和盐存储到数据库中。我认为创建签名函数会很直观:

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

可以调用为store('logins', {'username': 'bob', 'salt': 'foo', 'salted_hash' : 'bar'}),并且能够单独添加到logins新行中,bob的值username,{{1 } foo,et caetera。

不幸的是,我淹没了SQL代码。我试图以“动态类型”方式执行此操作,因为我不会因存储错误类型而受到惩罚,或者能够随意添加新列。

我想要功能,清理所有输入:

  • 检查表是否存在,如果不存在则创建表,并将字典中传递的键作为列;
  • 如果表已经存在,请检查表是否具有指定的列(传递的字典的键),如果不存在则添加它们(这是否可以用SQL?);
  • 将字典中的各个值添加到字典中的相应列中。

我可以使用salt作为后者,但它似乎非常严格。例如,如果列不存在会发生什么?我们怎么可以添加它们呢?

我不介意代码是针对Python 3的INSERT定制的,还是仅仅作为大纲的SQL;只要我能够工作并在某种程度上使用它(并从中学习)我就非常感激。

(另一方面,我想知道我可以使用哪些其他方法而不是SQL'd关系数据库;我之前使用过亚马逊的SimpleDB,并考虑过将其用于此目的,因为它非常 “动态类型化”,但我想知道为此目的我必须使用哪些SQL代码。)

1 个答案:

答案 0 :(得分:1)

  1. SQLite3是动态类型的,所以没问题。

  2. CREATE TABLE IF NOT EXISTS <name> ...请参阅here.

  3. 您可以使用this FAQ.中记录的sqlite_master查看表中是否已存在您需要的列。您需要解析sql列,但由于它是正是您的程序为创建表提供了什么,您应该知道语法。

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