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

Buf*_*ley 13 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) )
Run Code Online (Sandbox Code Playgroud)

这是插入和更新声明:

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()
Run Code Online (Sandbox Code Playgroud)

代码处理插入正常,但更新表中的所有行.你能帮我理解这个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']))).\
Run Code Online (Sandbox Code Playgroud)

这是一个非常简单的语法,但考虑到SQLAlchemy的许多层,很难确定在此上下文中确切应用了什么.

Kou*_*Das 17

您还可以使用& python 运算符

例如:

query.where(
   (ModelName.c.column_name == "column_value") &
   (ModelName.c.column_name == "column_value)
)
Run Code Online (Sandbox Code Playgroud)

例如,如果您有这样的查询

user_query = User.select().where(
   (User.c.id == 12) &
   (User.c.email == "myemail@gmail.com")
)
Run Code Online (Sandbox Code Playgroud)

这将生成一个像这样的原始 SQL

select * from users where id = 12 and email = "myemail@gmail.com"
Run Code Online (Sandbox Code Playgroud)


Kei*_*ith 16

在我看来,你正在使用Python"和"操作,它将只评估它周围的一个子句.您应该尝试使用SQLAlchemy中的"and_"函数.将这两个子句放在"and_"函数中.