SQLAlchemy中的conn.execute('some string')和conn.execute(text('some string'))有什么区别?

时间:2019-08-05 19:18:53

标签: python sqlalchemy

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

亲切的问候

1 个答案:

答案 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消除了手动处理的需要,并允许将序列视为单个参数。