我在编写SQLAlchemy Core中应该是一个简单的SQL更新语句时遇到了困难。但是,我找不到任何文档,示例或教程,说明如何组合多个where条件。我确定它在那里 - 找不到它。
这是表格:
self.struct = Table('struct',
metadata,
Column('schema_name', String(40), nullable=False,
primary_key=True),
Column('struct_name', String(40), nullable=False,
primary_key=True),
Column('field_type', String(10), nullable=True),
Column('field_len', Integer, nullable=True) )
这是插入&更新声明:
def struct_put(self, **kv):
try:
i = self.struct.insert()
result = i.execute(**kv)
except exc.IntegrityError: # row already exists - update it:
u = self.struct.update().\
where((self.struct.c.struct_name==kv['struct_name']
and self.struct.c.schema_name==kv['schema_name'])).\
values(field_len=kv['field_len'],
field_type=kv['field_type'])
result = u.execute()
代码处理插入正常,但更新表中的所有行。你能帮我理解这个where子句的语法吗?欢迎所有建议 - 提前感谢。
编辑:修正后的条款如下:
where((and_(self.struct.c.parent_struct_name==kv['parent_struct_name'],
self.struct.c.struct_name==kv['struct_name'],
self.struct.c.schema_name==kv['schema_name']))).\
这是一个非常简单的语法,但鉴于SQLAlchemy的许多层次,确定在此上下文中确切应用的内容非常困难。
答案 0 :(得分:11)
在我看来,你正在使用Python“和”操作,它将只评估它周围的一个子句。您应该尝试使用SQLAlchemy中的“and_”函数。将这两个子句放在“and_”函数中。
答案 1 :(得分:1)
在SQLAlchemy中,tablename.c
是在构造SQLAlchemy将在运行时处理的条件时使用的特殊值。
在这种特殊情况下,您只是简单地说“更新名为struct_name
的列与传递到struct_put(struct_name="struct_value", schema_name="schema_value")
的值匹配的所有行,名为schema_name
的列与以schema_name
传入的值。