带变量@

时间:2018-01-03 16:13:58

标签: python mysql pandas variables

我知道Python中的查询可以使用?%s执行查询herehere

进行参数化

但是我有一些长查询会使用在查询开头定义的一些常量变量

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查询中定义的原始变量吗?

1 个答案:

答案 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

但这取决于您使用的数据库驱动程序。

来自pandas.read_sql docs

  

检查数据库驱动程序文档,了解五种语法中的哪一种   支持PEP 249的paramstyle中描述的样式。例如。对于   psycopg2,使用%(name)s所以使用params = {'name':'value'}