我知道Python中的查询可以使用?
或%s
执行查询here或here
但是我有一些长查询会使用在查询开头定义的一些常量变量
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查询中定义的原始变量吗?
答案 0 :(得分:1)
原因
{
"questions" : [{"number": "1", "text": "1", "answer": "1"},
{"number": "2", "text": "2", "answer": "2"},
{"number": "3", "text": "3", "answer": "3"}]
}
override func viewDidLoad() {
super.viewDidLoad()
let url = Bundle.main.url(forResource: "0", withExtension: "json")!
let data = try! Data(contentsOf: url)
let result = try! JSONDecoder().decode(Root.self, from: data)
self.questions = result.questions
textField.delegate = self
textField.returnKeyType = .done
_ = textFieldShouldReturn(textField)
}
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
textField.resignFirstResponder()
let question = questions[counter]
title = question.number
textLabel.text = question.text
showAnswerLabel.text = question.answer
counter = (counter + 1) % questions.count
if textField.text == question.answer {
print("right")
}
return true
}
抛出异常是因为你正在做的就是将null_value设置为'',然后选择 编辑 query_str = "Set @null_val = \'\'; "\
" select @null_val"
erpur_df = pd.read_sql(query_str, con = db)
- 你究竟期望给你什么?''
似乎一次只执行一个查询,并且由于第一个查询没有返回任何行,因此会导致该异常。
如果将它们拆分为两次read_sql调用,那么它实际上会在第二次调用中返回read_sql
的值。由于这种行为,@null value
显然不是一个好方法。我强烈建议您使用下面的建议之一。
为什么要使用'@'在SQL中设置变量?
您可以尝试使用read_sql
样式的字符串格式。
像这样:
.format
请记住,如果您这样做并且您的query_str = "select ... coalesce(field1, {c}), case(.. then {c})...".format(c=my_const)
pd.read_sql(query_str)
是用户输入,那么您需要手动清理它以防止SQL注入。
另一种可能性就是如此使用params的词典:
my_const
但这取决于您使用的数据库驱动程序。
检查数据库驱动程序文档,了解五种语法中的哪一种 支持PEP 249的paramstyle中描述的样式。例如。对于 psycopg2,使用%(name)s所以使用params = {'name':'value'}