SQLAlchemy:具有多个where条件的SQL表达式

时间:2012-02-01 06:19:34

标签: python sqlalchemy

我在编写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的许多层次,确定在此上下文中确切应用的内容非常困难。

2 个答案:

答案 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传入的值。