以下解决方案使用SQLAlchemy表达式语言并与SQLAlchemy 1.1一起使用。该解决方案不将参数与查询混合(按原始作者的要求),但是提供了一种使用SQLAlchemy模型为不同SQL方言生成SQL查询字符串和参数字典的方法。该示例基于教程http://docs.sqlalchemy.org/en/rel_1_0/core/tutorial.html
上课了
from sqlalchemy import Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
class foo(Base):
__tablename__ = 'foo'
id = Column(Integer(), primary_key=True)
name = Column(String(80), unique=True)
value = Column(Integer())
我们可以使用select函数生成查询语句。
from sqlalchemy.sql import select
statement = select([foo.name, foo.value]).where(foo.value > 0)
接下来,我们可以将语句编译成查询对象。
query = statement.compile()
默认情况下,该语句使用与SQLite和Oracle等SQL数据库兼容的基本“命名”实现进行编译。如果需要指定方言(例如PostgreSQL),则可以执行
from sqlalchemy.dialects import postgresql
query = statement.compile(dialect=postgresql.dialect())
或者,如果您想将方言明确指定为SQLite,则可以将参数样式从“ qmark”更改为“ named”。
from sqlalchemy.dialects import sqlite
query = statement.compile(dialect=sqlite.dialect(paramstyle="named"))
从查询对象中,我们可以提取查询字符串和查询参数
query_str = str(query)
query_params = query.params
最后执行查询。
conn.execute( query_str, query_params )