簡體   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