Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用SqlAlchemy执行原始查询(在SQL Server数据库和Pymssql上)时,传递无法识别的参数并引发SQL错误_Python_Sql Server_Sqlalchemy_Pymssql_Parameterized Query - Fatal编程技术网

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

Python 使用SqlAlchemy执行原始查询(在SQL Server数据库和Pymssql上)时,传递无法识别的参数并引发SQL错误,python,sql-server,sqlalchemy,pymssql,parameterized-query,Python,Sql Server,Sqlalchemy,Pymssql,Parameterized Query,我尝试在SQL Server db上执行简单的原始SQL查询,并使用SqlAlchemy和PymSQL作为提供程序 这是我第一次尝试使用连接的execute方法,并以**kwargs方式传递参数: provider = DataProvider().engine q = "select url from Crawler.CrawlSource where source=@source" query = text(q) result = provider.connect().execute(que

我尝试在SQL Server db上执行简单的原始SQL查询,并使用SqlAlchemy和PymSQL作为提供程序

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

provider = DataProvider().engine
q = "select url from Crawler.CrawlSource where source=@source"
query = text(q)
result = provider.connect().execute(query, source ='mysource')
provider = DataProvider().engine
q = "select url from Crawler.CrawlSource where source=@source"
query = text(q)
result = provider.execute(query, source ='mysource')
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')
我以教程中所示的任何方式传递参数,如kwargs传递和dict传递,但这两种方式都不起作用,当调用execute方法时,会抛出一个异常,表示“必须声明标量变量”@source,就好像没有参数传递给execute方法一样,在这种情况下,ORM或数据提供程序pymssql似乎不识别传递给execute方法的参数,而只将不带参数的查询传递给db引擎,从而导致异常

我猜MSSQL服务器提供程序Pymssql可能存在一些问题,因为SQL Server不是SqlAlchemy和Python家族中的第一流公民,但不知道是什么导致了这一问题

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

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

provider = DataProvider().engine
q = "select url from Crawler.CrawlSource where source=@source"
query = text(q)
result = provider.connect().execute(query, {source :'mysource'})
provider = DataProvider().engine
q = "select url from Crawler.CrawlSource where source=@source"
query = text(q)
result = provider.execute(query, {source :'mysource'})
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'})
我第三次尝试使用engine对象的execute方法并以**kwargs方式传递参数:

provider = DataProvider().engine
q = "select url from Crawler.CrawlSource where source=@source"
query = text(q)
result = provider.connect().execute(query, source ='mysource')
provider = DataProvider().engine
q = "select url from Crawler.CrawlSource where source=@source"
query = text(q)
result = provider.execute(query, source ='mysource')
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')
我的第四次尝试使用engine对象的execute方法并按dict传递参数:

provider = DataProvider().engine
q = "select url from Crawler.CrawlSource where source=@source"
query = text(q)
result = provider.connect().execute(query, {source :'mysource'})
provider = DataProvider().engine
q = "select url from Crawler.CrawlSource where source=@source"
query = text(q)
result = provider.execute(query, {source :'mysource'})
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方法,并将参数作为dict传递:

provider = DataProvider().engine
q = "select url from Crawler.CrawlSource where source=@source"
query = text(q)
result = provider.connect().execute(query, {source :'mysource'})
provider = DataProvider().engine
q = "select url from Crawler.CrawlSource where source=@source"
query = text(q)
result = provider.execute(query, {source :'mysource'})
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
q = "select url from Crawler.CrawlSource where source=@source"
query = text(q)
result = provider.connect().execute(query, source ='mysource')
provider = DataProvider().engine
q = "select url from Crawler.CrawlSource where source=@source"
query = text(q)
result = provider.execute(query, source ='mysource')
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。这对我很有用:

将sqlalchemy作为sa导入 engine=sa.create_enginemssql+pymssql://@localhost:49242/myDb sql=从语言=%langs的词汇表中选择单词 params={'lang':'Greek'} 使用发动机。以连接方式开始: 结果=conn.executesql,params.fetchall 打印结果 ['γιορτή',, 'ηλεκτρονικός υπολογιστής',] 如果使用SQLAlchemy文本对象,也可以使用命名的paramstyle:

sql=sa.sql.text从语言=:lang的词汇表中选择单词 params={'lang':'Greek'} 使用发动机。以连接方式开始: 结果=conn.executesql,params.fetchall 打印结果 ['γιορτή',, 'ηλεκτρονικός υπολογιστής',]
text对象允许我们一致使用命名的paramstyle,而不考虑DB-API层支持的本机paramstyle,例如,pymssql的%s?用于pyodbc。

尝试使用。。。其中source=:source@GordThompson的可能副本尝试了,“:”不适用于在sql server中传递参数它适用于Postgress Ithink@GordThompson它不是复制品。您发送的帖子不是针对SQL Server的。如果你读对了这个问题,我还提到我将参数作为字典传递,但效果不好。我猜SQL Server兼容性有点问题,因为它在以dictNo形式传递参数时适用于其他数据库:例如,命名参数的样式在cx_Oracle驱动程序上本机工作,但SQLAlchemy文本将命名样式转换为驱动程序使用的样式。此外,Session.execute处理文本查询就像自动用文本包装一样。非常感谢,第二个选项对我很有用!