我知道可以使用?
或%s
在此处或此处的执行查询中对Python中的查询进行参数化
但是我有一些长查询,它将使用在查询开始时定义的一些常量变量
Set @my_const = 'xyz';
select @my_const;
-- Query that use @my_const 40 times
select ... coalesce(field1, @my_const), case(.. then @my_const)...
我想对MySQL的查询做最少的修改。因此,与其将查询修改为
pd.read_sql(select ... coalesce(field1, %s), case(.. then %s)... , [my_const, my_const, my_const, ..]
,我可以按照初始查询的内容写一些东西。经过尝试以下,但是,我得到一个TypeError: 'NoneType' object is not iterable
query_str = "Set @null_val = \'\'; "\
" select @null_val"
erpur_df = pd.read_sql(query_str, con = db)
任何想法如何使用Mysql查询中定义的原始变量?
原因
query_str = "Set @null_val = \'\'; "\
" select @null_val"
erpur_df = pd.read_sql(query_str, con = db)
抛出该异常是因为 您所做的只是将null_value设置为'',然后选择该选项 EDIT ''
-您期望给您什么? read_sql
似乎只一次执行一个查询,并且由于第一个查询不返回任何行,因此会导致该异常。如果将它们分成对read_sql的两个调用,则实际上它将返回您@null value
在第二个调用中的值。由于这种行为read_sql
,显然不是执行此操作的好方法。我强烈建议您使用以下我的建议之一。
无论如何,为什么要在SQL中使用“ @”设置变量?
您可以尝试使用.format
字符串格式的样式。
像这样:
query_str = "select ... coalesce(field1, {c}), case(.. then {c})...".format(c=my_const)
pd.read_sql(query_str)
只要记住,如果您以这种方式进行操作并且您my_const
是用户输入,那么您将需要手动对其进行清理以防止SQL注入。
另一种可能性是使用类似这样的参数字典:
query_str = "select ... coalesce(field1, %(my_const)s, case(.. then %(my_const)s)..."
pd.read_sql(query_str, params={'my_const': const_value})
但是,这取决于您使用哪个数据库驱动程序。
检查您的数据库驱动程序文档,以支持PEP 249的paramstyle中描述的五种语法样式中的哪一种。例如。对于psycopg2,使用%(name)s,因此请使用params = {'name':'value'}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句