代码之家  ›  专栏  ›  技术社区  ›  jbarlow

在某些字段为空的情况下,使用python参数替换将记录插入到sqlite中

  •  2
  • jbarlow  · 技术社区  · 14 年前

    我正在运行这种查询:

    insert into mytable (id, col1, col2)
    values (:ID, :COL1, :COL2)
    

    在python中,这种形式的字典可以与上面的查询结合使用,用于参数替换:

    d = { 'ID' : 0, 'COL1' : 'hi', 'COL2' : 'there' }
    cursor.execute(sql_insert, d)
    

    但在实际问题中,有很多列和行。有时,填充字典的数据源没有条目。但是,如果字典很短,则sqlite将抱怨提供的绑定数量不正确,而不是为我提供在本例中未填充的列中添加空字符串或空值的方法。

    我是个懒惰的人,或者有点完美主义者。我可以编写一些代码,以便在字典中添加任何缺少的字段。我只是在寻找一个优雅的解决方案,它不需要将字段列表三倍化。

    我试图用一个修改过的字典重载字典,如果字段丢失,它将返回空字符串。

    3 回复  |  直到 14 年前
        1
  •  7
  •   Duncan    14 年前

    我没有检查过这是否有效,但我认为应该:

    from collections import defaultdict
    d = { 'ID' : 0, 'COL1' : 'hi' }
    cursor.execute(sql_insert, defaultdict(str, d))
    

    defaultdict 是一个专门的字典,其中任何缺少的键都会产生新的值,而不是 KeyError .

    当然,这只在所有值都需要相同的默认值(如空字符串或无)时才有效。如果您需要不同的默认值,那么您需要一个包含默认值的字典,您可以这样做:

    DEFAULTS = { ... whatever ... }
    d = { 'ID' : 0, 'COL1' : 'hi' }
    cursor.execute(sql_insert, dict(DEFAULTS).update(d))
    

    请注意,每次都必须复制默认值,以便使用实际值更新副本。

        2
  •  0
  •   MattH    14 年前

    老实说,我不完全确定你在问什么。您似乎在说您想要为一个表行构建一个insert语句,其中有一些字段值(但不是所有字段值)已经准备好了。

    您可以这样构建查询(利用 dict.get 返回 None 对于丢失的密钥):

    >>> columns = ['id','col1','col2','col_missing']
    >>> myData = {'id': 0, 'col1': 'hi', 'col2':'there'}
    >>> myQuery = 'insert into mytable (%s) values (%s)' % (",".join(columns),",".join(['%s']*len(columns)))
    >>> myArgs = [ myData.get(x) for x in columns ]
    >>> myQuery
    'insert into mytable (id,col1,col2,col_missing) values (%s,%s,%s,%s)'
    >>> myArgs
    [0, 'hi', 'there', None]
    >>> cursor.execute(myQuery,myArgs)
    
        3
  •  0
  •   Daniel Hill    14 年前

    默认约束指定执行插入时要使用的默认值。该值可以是空值、字符串常量、数字或括在括号中的常量表达式。

    引用自 here .

    所以用 CREATE 这样地:

    CREATE mytable {
        id INTEGER PRIMARY KEY,
        col1 TEXT DEFAULT 'Hello, World!',
        col2 TEXT DEFAULT 'The cake in a lie'
    }