繁体   English   中英

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

[英]Passing parameters not being recognized and throws SQL error when executing raw query (on SQL-Server database and Pymssql) with SqlAlchemy

我正在尝试使用 SqlAlchemy(和 Pymssql 作为提供者)在 SQL-Server db 上执行简单的原始 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方法时抛出一个异常,上面写着'Must declare the scalar variable' @source ,好像没有参数一样传递给execute方法,似乎 ORM (或者可能是数据提供者(在这种情况下为pymssql))不识别传递给execute方法的参数,并且只将查询(不带参数)传递给数据库引擎(这会导致异常)。

I guess there might be some issue with MSSQL-Server provider (Pymssql) since SQL-Server is not first class citizen in SqlAlchemy and Python family, but have no direct clue what could causes this.

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

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

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

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

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

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

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

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

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”参数样式 这对我有用:

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 object,我们也可以使用“命名”参数样式:

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 object 允许我们始终使用“命名”参数样式,而不管 DB-API 层支持的本机参数样式(例如,用于 pymssql %s ,用于 pyodbc 的? )。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM