使用mysql-python执行不同的查询

使用mysql-python执行不同的查询,python,mysql,django,mysql-python,Python,Mysql,Django,Mysql Python,我正在使用远程数据库将数据导入Django项目的数据库 在MySQLdb的帮助下,我轻松地创建了如下导入函数: def connect_and_get_data(useful_string): CONNECTION = MySQLdb.connect(host=..., port=..., user=..., passwd=..., db=..., curs

我正在使用远程数据库将数据导入Django项目的数据库

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\u和\u get\u 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)
    ...
通过对
连接和获取数据的修改

def connect_and_get_data(query):
    ...
    cursor.execute(query)
    ...
正如您可能已经想象的那样,这种解决方案失败了

阅读mluebke对问题的回答

您正在向execute函数传递参数,而不是进行python字符串替换

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

是否有一种“好”的方法来封装我的
connect\u和\u get\u data(query)
函数,以便以我想要的方式为我服务,或者我完全走错了这条路


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

我想这就是你想要的

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()
...

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

我正在使用Python和MYSQL执行一个web应用程序项目,我遇到了相同的错误类型:

MySQLdb._exceptions.OperationalError:(1045,“拒绝用户访问 “root'@“localhost”(使用密码:YES)”)

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

app.config['MYSQL_PASSWORD'] = ""

然后我成功地登录了

是的。。。你说得对!我正朝这个方向走。。。但是如果我的查询中需要两个有用的_字符串呢?这将转换
数据
一个args数组。。。正确的?接收字符串数组时,cursor.execute将如何反应?嗯……您可以使用元组(类似于数组的序列)作为第二个参数来连接和获取数据
cursor.execute
接受元组作为第二个参数。元组只是由括号包围的元素序列,例如
(“一”、“二”、“三”)
。事实上,如果您查看代码,您可以在括号中看到
(有用的字符串)
作为
execute()
的参数。无法在许多查询中重复使用我的连接:不幸的是,远程数据库位于一台非常慢(上传少于10k)且连接极不稳定的机器上(在太平洋中部的一个岛上工作有他的缺点,其中一个是慢卫星连接)…所以我必须有短而轻的“原子”DB连接…BTW,我喜欢你的解决方案(第一块代码,因为第二不适用)。我不知道为什么我会在元组参数的事情面前阻止自己…的确,有时我们太沉浸在代码中,以至于我们看不到明显的解决方案…谢谢;)“有趣”注意:在第一个版本中,我在原始代码中描述的,从execute()返回的结果这是一个字典列表。在修改后的版本中,即带有封装函数的版本中,execute()返回的结果是字典的元组。。。你知道原因吗?