【发布时间】:2011-04-04 09:19:20
【问题描述】:
我正在使用 Python 3 的 sqlite3 模块,并在此过程中熟悉 SQL。
我编写了一个玩具程序来散列加盐密码并将其、关联的用户名和加盐存储到数据库中。我认为创建签名的功能会很直观:
def store(table, data, database=':memory:')
例如,store('logins', {'username': 'bob', 'salt': 'foo', 'salted_hash' : 'bar'}) 可调用,并且能够单独添加到 logins 中,在新的一行中添加值 bob 为 username,foo 为 salt 等。
不幸的是,我忙于编写什么 SQL 代码。我正在尝试以“动态类型”的方式执行此操作,例如,我不会因存储错误类型或能够随意添加新列而受到惩罚。
我希望该功能能够清理所有输入:
- 检查表是否存在,如果不存在,则创建它,将字典中传递的键作为列;
- 如果表已经存在,检查表是否有指定的列(传递字典的键),如果没有则添加它们(这甚至可以用 SQL 实现吗?);
- 将字典中的各个值添加到字典中的相应列中。
我可以将INSERT 用于后者,但它似乎很死板。例如,如果列不存在会怎样?那么我们如何添加它们呢?
我不介意代码是针对 Python 3 的sqlite3 量身定制的,还是只是作为大纲的 SQL;只要我能工作并在一定程度上使用它(并从中学习)我就非常感激。
(另一方面,我想知道我可以使用哪些其他方法来代替 SQL 的关系数据库;我之前使用过 Amazon 的 SimpleDB,并且考虑过将其用于此目的,因为它非常 “动态类型”,但我想知道为此我必须使用什么 SQL 代码。)
【问题讨论】:
-
你考虑过使用成熟的 ORM 吗? SQLAlchemy (sqlalchemy.org) 非常时髦
-
如果你想要一个完整的无模式/动态体验,像 sqlite 这样的 rdbms 不是正确的选择。
标签: python sql sqlite python-3.x