python - 使用 SqlAlchemy 执行原始查询(在 SQL-Server 数据库和 Pymssql 上)时,传递的参数无法识别并引发 SQL 错误

标签 python sql-server sqlalchemy pymssql parameterized-query

我正在尝试使用 SqlAlchemy(以及 Pymssql 作为提供程序)在 SQL-Server 数据库上执行简单的原始 SQL 查询。

这是我的第一次尝试(使用 execute 连接方法并以 **kwargs 方式传递参数):

provider = DataProvider().engine
q = "select url from Crawler.CrawlSource where source=@source"
query = text(q)
result = provider.connect().execute(query, source ='mysource')

我以教程中显示的任何方式传递了参数(作为 kwargs 传递和作为 dict 传递),但它们都不起作用,并且当调用 execute 方法时,会抛出异常,显示 '必须声明标量变量'@source 就好像没有参数传递给 execute 方法,看起来是 ORM (或者可能是数据提供程序(在本例中为 pymssql) ) 无法识别传递给 execute 方法的参数,并且仅将查询(不带参数)传递给数据库引擎(这会导致异常)。

我猜 MSSQL-Server 提供程序 (Pymssql) 可能存在一些问题,因为 SQL-Server 不是 SqlAlchemy 和 Python 家族中的一等公民,但没有直接线索可能导致此问题。

正如我上面所说,我也尝试了其他方法

这是我的第二次尝试(使用 execute 连接方法并将参数作为字典传递):

provider = DataProvider().engine
q = "select url from Crawler.CrawlSource where source=@source"
query = text(q)
result = provider.connect().execute(query, {source :'mysource'})

我的第三次尝试(使用引擎对象的execute方法并以**kwargs方式传递参数):

provider = DataProvider().engine
q = "select url from Crawler.CrawlSource where source=@source"
query = text(q)
result = provider.execute(query, source ='mysource')

我的第四次尝试(使用引擎对象的execute方法并将参数作为字典传递):

provider = DataProvider().engine
q = "select url from Crawler.CrawlSource where source=@source"
query = text(q)
result = provider.execute(query, {source :'mysource'})

我的第五次尝试(创建 session 并使用 session 的 execute 方法并将参数作为字典传递):

provider = DataProvider().engine
session = sessionmaker(bind=provider)()
q = "select url from Crawler.CrawlSource where source=@source"
query = text(q)
result = session.execute(query, {source :'mysource'})

我的第六次尝试(创建 session 并使用 session 的 execute 方法并以 **kwargs 方式传递参数):

provider = DataProvider().engine
session = sessionmaker(bind=provider)()
q = "select url from Crawler.CrawlSource where source=@source"
query = text(q)
result = session.execute(query,  source='mysource')

但正如我之前提到的,上述努力都没有奏效,并且所有这些都导致了上面提到的相同异常

如有任何帮助,我们将不胜感激

最佳答案

mssql+pymssql 方言似乎支持“pyformat”paramstyle 。这对我有用:

import sqlalchemy as sa

engine = sa.create_engine("mssql+pymssql://@localhost:49242/myDb")

sql = "SELECT word FROM vocabulary WHERE language = %(lang)s"
params = {'lang': 'Greek'}
with engine.begin() as conn:
    result = conn.execute(sql, params).fetchall()
    print(result)
    # [('γιορτή',), ('ηλεκτρονικός υπολογιστής',)]

如果我们使用 SQLAlchemy text 对象,我们还可以使用“命名”参数样式:

sql = sa.sql.text("SELECT word FROM vocabulary WHERE language = :lang")
params = {'lang': 'Greek'}
with engine.begin() as conn:
    result = conn.execute(sql, params).fetchall()
    print(result)
    # [('γιορτή',), ('ηλεκτρονικός υπολογιστής',)]

text 对象允许我们一致地使用“命名”参数样式,而不管 DB-API 层支持的 native 参数样式如何(例如,%s 用于 pymssql, ? 用于 pyodbc)。

关于python - 使用 SqlAlchemy 执行原始查询(在 SQL-Server 数据库和 Pymssql 上)时,传递的参数无法识别并引发 SQL 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60026313/

相关文章:

python - 如何正确添加wsgi的路径?

python - 使用 WHERE 在 SQLAlchemy Core 中进行批量更新

python - Flask sqlalchemy 多对多插入数据

c# - 添加两个 .NET SqlDecimals 会提高精度吗?

mysql - 'master..sysdatabases' 在 MySQL 中等效的 SQL Server 语法

python - 为什么 SQLAlchemy 关联对象中的外键被标记为主键?

python - 减去单独列等于特定值的列

python - 交叉两个字典

python - Django 模型 ImageField 中的默认图像不起作用

MYSQL使用多个主键的重复键语法