【问题标题】:SQL to handle table updates in a "dynamically typed" fashionSQL 以“动态类型”的方式处理表更新
【发布时间】: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 中,在新的一行中添加值 bobusernamefoosalt 等。

不幸的是,我忙于编写什么 SQL 代码。我正在尝试以“动态类型”的方式执行此操作,例如,我不会因存储错误类型或能够随意添加新列而受到惩罚。

我希望该功能能够清理所有输入:

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

我可以将INSERT 用于后者,但它似乎很死板。例如,如果列不存在会怎样?那么我们如何添加它们呢?

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

(另一方面,我想知道我可以使用哪些其他方法来代替 SQL 的关系数据库;我之前使用过 Amazon 的 SimpleDB,并且考虑过将其用于此目的,因为它非常 “动态类型”,但我想知道为此我必须使用什么 SQL 代码。)

【问题讨论】:

  • 你考虑过使用成熟的 ORM 吗? SQLAlchemy (sqlalchemy.org) 非常时髦
  • 如果你想要一个完整的无模式/动态体验,像 sqlite 这样的 rdbms 不是正确的选择。

标签: python sql sqlite python-3.x


【解决方案1】:
  1. SQLite3 是动态类型的,所以没有问题。

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

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

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

【讨论】:

    猜你喜欢
    • 2019-11-10
    • 1970-01-01
    • 1970-01-01
    • 2020-03-30
    • 2011-02-03
    • 2019-02-21
    • 1970-01-01
    • 2015-02-18
    • 1970-01-01
    相关资源
    最近更新 更多