接受表和列名称并返回与给定的过滤器值匹配的所有主键值的通用函数

时间:2010-05-10 08:04:09

标签: python sqlalchemy

我的代码看起来像这样的函数

def get_M_status(S): 
    M_id = marital.select(marital.c.marital_status_description == S).execute().fetchone()
    if M_id == None:
        print "Warning: No Marital id found for %s Marital status to Single" % S
        M_id = marital.select(marital.c.marital_status_description == "Single").execute().fetchone()       
    return M_id[0]

我想知道它们是否是一种编写泛型函数的方法,我可以传递相关值,即:表名主键列过滤列和过滤值

欢呼

2 个答案:

答案 0 :(得分:1)

如果主键只有一列,您可以执行以下操作:

getattr(table.c, pkey_col_name) == S

作为marital.c.marital_status_description == S的“通用”版本。

所以,(请注意:这是未经测试的):

def get_row(table, col_name, val, default=None):
    col = getattr(table.c, col_name)
    row = table.select(col == S).execute().fetchone()
    if row == None:
        print "Warning: No row found for %s in %s; using %s" % (val, table, default)
        row = table.select(col == default).execute().fetchone()       
    return row[0]

如果你有映射类,这更容易;你可以做以下事情:

record = session.query(Marital).get(key)

其中Marital是表marital的映射类,session是sql炼金术会话,key是键列的元组(按顺序)。如果表中存在密钥,则record将是找到的行;否则它将是None

答案 1 :(得分:1)

表对象有一个primary_key属性,该属性包含组成主键的列。选择它,只需添加where子句即可完成:

def get_pks_by_col(tbl, col_name, col_value):
    s = select(tbl.primary_key.columns).where(tbl.columns[col_name] == col_value)
    return s.execute().fetchall()

根据您的具体情况进行修改。 (len(tbl.primary_key)== 1是保证的,需要传入连接执行等)。