使用 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
我正在尝试在 SQL-Server 数据库上使用 SqlAlchemy(和 Pymssql 作为提供程序)执行简单的原始 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))无法识别传递给 [=18= 的参数] 方法并仅将查询(不带参数)传递给数据库引擎(这会导致异常)。
我想 MSSQL-Server 提供程序 (Pymssql) 可能存在一些问题,因为 SQL-Server 不是 SqlAlchemy 和 Python 中的第一个 class 公民家人,但不知道是什么原因造成的。
正如我上面所说,我也尝试了其他方法
这是我的第二次尝试(使用 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'})
我的第五次尝试(创建会话并使用会话的 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'})
我的第六次尝试(创建会话并使用会话的 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')
但正如我之前提到的,none 上述努力奏效了,所有这些都导致了上述相同的异常
任何帮助将不胜感激
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 层支持的本机参数样式(例如,%s
用于 pymssql,?
对于 pyodbc)。
我正在尝试在 SQL-Server 数据库上使用 SqlAlchemy(和 Pymssql 作为提供程序)执行简单的原始 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))无法识别传递给 [=18= 的参数] 方法并仅将查询(不带参数)传递给数据库引擎(这会导致异常)。
我想 MSSQL-Server 提供程序 (Pymssql) 可能存在一些问题,因为 SQL-Server 不是 SqlAlchemy 和 Python 中的第一个 class 公民家人,但不知道是什么原因造成的。
正如我上面所说,我也尝试了其他方法
这是我的第二次尝试(使用 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'})
我的第五次尝试(创建会话并使用会话的 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'})
我的第六次尝试(创建会话并使用会话的 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')
但正如我之前提到的,none 上述努力奏效了,所有这些都导致了上述相同的异常
任何帮助将不胜感激
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 层支持的本机参数样式(例如,%s
用于 pymssql,?
对于 pyodbc)。