<p>假设您的<code>terms</code>变量包含有效的SQL语句片段,您可以简单地将前面带星号的<code>terms</code>传递给<code>or_</code>或<code>and_</code>:</p>
<pre><code>>>> from sqlalchemy.sql import and_, or_
>>> terms = ["name='spam'", "email='spam@eggs.com'"]
>>> print or_(*terms)
name='spam' OR email='spam@eggs.com'
>>> print and_(*terms)
name='spam' AND email='spam@eggs.com'
</code></pre>
<p>注意,这假设<code>terms</code>只包含有效的</em>和<em>正确转义的</em>SQL片段,因此如果恶意用户可以以某种方式访问<code>terms</code>,这可能是不安全的。</p>
<p>与其自己构建SQL片段,不如让SQLAlchemy使用<code>sqlalchemy.sql</code>中的其他方法构建参数化SQL查询。我不知道您是否为表准备了<code>Table</code>对象;如果准备了,假设您有一个名为<code>users</code>的变量,它是<code>Table</code>的实例,它描述了数据库中的<code>users</code>表。然后您可以执行以下操作:</p>
<pre><code>from sqlalchemy.sql import select, or_, and_
terms = [users.c.name == 'spam', users.c.email == 'spam@eggs.com']
query = select([users], and_(*terms))
for row in conn.execute(query):
# do whatever you want here
</code></pre>
<p>在这里,<code>users.c.name == 'spam'</code>将创建一个<code>sqlalchemy.sql.expression._BinaryExpression</code>对象,该对象记录这是<code>users</code>表的<code>name</code>列与包含<code>spam</code>的字符串文本之间的二进制等式关系。当您将此对象转换为字符串时,您将得到一个类似<code>users.name = :1</code>的SQL片段,其中<code>:1</code>是参数的占位符。<code>_BinaryExpression</code>对象还记得<code>:1</code>到<code>'spam'</code>的绑定,但在执行SQL查询之前不会插入它。插入时,数据库引擎将确保正确转义。建议阅读:<a href="http://www.sqlalchemy.org/docs/05/sqlexpression.html#operators" rel="noreferrer">SQLAlchemy's operator paradigm</a></p>
<p>如果只有数据库表,但没有描述该表的<code>users</code>变量,则可以自己创建它:</p>
<pre><code>from sqlalchemy import Table, MetaData, Column, String, Boolean
metadata = MetaData()
users = Table('users', metadata,
Column('id', Integer, primary_key=True),
Column('name', String),
Column('email', String),
Column('active', Integer)
)
</code></pre>
<p>或者,您可以使用autoloading查询数据库引擎以获得数据库的结构,并自动构建<code>users</code>;显然这更耗时:</p>
<pre><code>users = Table('users', metadata, autoload=True)
</code></pre>