【问题标题】:Executing different queries using mysql-python使用 mysql-python 执行不同的查询
【发布时间】:2011-12-27 05:23:32
【问题描述】:

我正在使用远程数据库将数据导入我的 Django proyect 的数据库。

MySQLdb 的帮助下,我轻松地创建了如下导入函数:

def connect_and_get_data(useful_string):
    CONNECTION = MySQLdb.connect(host=..., port=...,
                                 user=..., passwd=..., db=...,
                                 cursorclass=MySQLdb.cursors.DictCursor,
                                 charset = "utf8")
    cursor = CONNECTION.cursor()
    cursor.execute("SELECT ... FROM ... WHERE ... AND some_field=%s", (useful_string))
    result = cursor.fetchall()
    cursor.close()

对此非常满意,按预期工作。

但是继续编写代码,我注意到有时我需要再次连接到数据库,以便执行其他不同的查询。

对我来说,第一个想法很合乎逻辑: 对于我需要的每个查询,定义一个以给定查询作为参数调用connect_and_get_data 的函数......像这样:

def get_data_about_first_amazing_topic(useful_string):
    query = "SELECT ... FROM ... WHERE ... AND some_field=%s" %(useful_string)
    connect_and_get_data(query)
    ...

def get_data_about_second_amazing_topic(other_useful_string):
    query = "SELECT ... FROM ... WHERE ... AND some_field=%s" %(other_useful_string)
    connect_and_get_data(query)
    ...

connect_and_get_data进行此修改:

def connect_and_get_data(query):
    ...
    cursor.execute(query)
    ...

正如您已经想象的那样,这个解决方案失败了。

阅读mluebke对问题python mysql fetch query的回答

“您正在将参数传递给执行函数,而不是进行 python 字符串替换”

我立刻明白我错在哪里;但我仍然觉得缺少一些东西:我尝试了不同的解决方案,但我绝对对所有这些都不满意。

有没有一种“好的”方法来封装我的connect_and_get_data(query) 函数,以便按照我想要的方式为我服务,或者我完全走错了路?

在这种情况下,哪些被认为是“最佳实践”

【问题讨论】:

    标签: python mysql django mysql-python


    【解决方案1】:

    我正在使用 Python 和 MYSQL 做一个 Web 应用程序项目,并且我遇到了相同的错误类型:

    MySQLdb._exceptions.OperationalError: (1045, "Access denied for user 'root'@'localhost' (使用密码: YES)").

    我所做的只是将应用配置密码更改为空字符串"",如下所示:

    app.config['MYSQL_PASSWORD'] = ""
    

    然后我就登录成功了。

    【讨论】:

      【解决方案2】:

      我想这就是你要找的。​​p>

      def connect_and_get_data(query, data):
          ...
          cursor.execute(query, data)
          ...
      
      def get_data_about_first_amazing_topic(useful_string):
          query = "SELECT ... FROM ... WHERE ... AND some_field=%s"
          connect_and_get_data(query, ("one","two","three"))
          ...
      

      但是,如果您要快速进行多个查询,最好重复使用您的连接,因为建立太多连接会浪费时间。

      ...
      CONNECTION = MySQLdb.connect(host=..., port=...,
                                   user=..., passwd=..., db=...,
                                   cursorclass=MySQLdb.cursors.DictCursor,
                                   charset = "utf8")
      cursor = CONNECTION.cursor()
      cursor.execute("SELECT ... FROM ... WHERE ... AND some_field=%s", ("first", "amazing", "topic"))
      first_result = cursor.fetchall()
      
      cursor.execute("SELECT ... FROM ... WHERE ... AND some_field=%s", (("first", "amazing", "topic")))
      second_result = cursor.fetchall()
      
      cursor.close()
      ...
      

      这将使您的代码执行得更好。

      【讨论】:

      • 是的...你是对的!我正朝着这个方向前进……但是如果我的查询中需要两个 useful_strings 怎么办?这会将data 转换为 args 数组...对吗?以及在接收字符串数组时 cursor.execute 将如何反应?嗯...
      • 您可以使用元组(类似于数组的序列)作为connect_and_get_data 的第二个参数。 cursor.execute 接受元组作为第二个参数。元组只是被括号包围的元素序列,例如("one","two","three")。事实上,如果您查看您的代码,您可以看到括号中的(useful_string) 作为execute() 的参数。
      • 无法为许多查询重用我的连接:不幸的是,远程数据库位于一台机器上,该机器的速度非常慢(上传少于 10k)和超级不稳定的连接(在中间的一个岛上工作)太平洋有他的缺点,其中之一是卫星连接速度慢)......所以我必须有短而轻的“原子”数据库连接......
      • 顺便说一句,我喜欢你的解决方案(第一段代码,因为第二段不适用)。我不知道为什么我把自己挡在了那个元组参数的前面......确实,有时我们只是太沉浸在我们的代码中,以至于我们看不到明显的解决方案摆在我们眼前...... . 谢谢;)
      • "funny" 注意:在第一个版本中,在我的原始代码中描述的那个,从 execute() 返回的结果是一个字典列表。在修改后的版本中,具有封装函数的版本,从 execute() 返回的结果是一个字典元组......你知道原因吗?
      猜你喜欢
      • 2018-06-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-05
      • 1970-01-01
      相关资源
      最近更新 更多