SQLAlchemy中的conn.execute('some string')
和conn.execute(text('some string'))
有什么区别?
在上面,conn是通过conn = engine.connect()
获得的。并通过create_engine
方法获得引擎。方法text()
是从sqlalchemy.sql`导入的。
我看到conn.execute('some string')
和conn.execute(text('some string'))
都出现在教程中,但是没有解释区别。例如参见here
亲切的问候
答案 0 :(得分:1)
text()
的官方文档很好地回答了这个问题:
text()
相对于普通字符串的优势在于对绑定参数,按语句执行选项以及绑定参数和结果列的键入行为的后端中立支持,从而允许SQLAlchemy类型构造发挥作用当执行从字面上指定的语句时。
您可能会更常用的是对绑定参数的后端中立支持。 PEP 249 — DB-API 2.0规范指定了实现可以使用的一系列不同的paramstyles。例如,sqlite3
模块使用qmark,而psycopg2
使用format和pyformat。使用text()
,您始终可以只使用命名的样式,SQLAlchemy将处理将其转换为您的DB-API驱动程序正在使用的样式。
您可能会遇到的另一种情况是,在将IN
子句与不支持psycopg2
的{{3}}之类的驱动程序一起使用时,定义绑定参数行为。传统上,您必须格式化查询所需数量的占位符,但是最近的SQLAlchemy支持版本tuples adaptation消除了手动处理的需要,并允许将序列视为单个参数。