我的代码看起来像这样的函数
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]
我想知道它们是否是一种编写泛型函数的方法,我可以传递相关值,即:表名主键列过滤列和过滤值
欢呼答案 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是保证的,需要传入连接执行等)。