为什么django和python MySQLdb每个数据库都有一个游标?

时间:2013-02-20 17:27:39

标签: python mysql django mysql-python

示例场景:

运行单个服务器的MySQL - > HOSTNAME

该服务器上的两个MySQL数据库 - >用户,游戏。

任务 - >从GAMES.my_games_table获取10个最新游戏,并从USERS.my_users_table获取玩这些游戏的用户(假设没有加入)

在Django以及Python MySQLdb中,为什么每个数据库都有一个游标更可取?

扩展游标的缺点是每个MySQL服务器单个并且可以切换数据库(例如通过查询“使用USERS;”),然后处理相应的数据库

MySQL连接很便宜,但是如果有一个线性流并且没有复杂的tranasactions可能需要两个游标,那么单个连接并不比许多连接好吗?

3 个答案:

答案 0 :(得分:9)

一个较短的答案是,“MySQL不支持那种类型的游标”,所以Python-MySQL也不支持,所以首选一个连接命令的原因是因为这就是MySQL的工作方式。这是一种重言式。

然而,答案更长的是:

  1. 根据您的定义,'游标'将是RDMS中访问表和索引的某种类型的对象,能够维持其状态。
  2. 根据您的定义,'connection'将接受命令,并分配或重用游标以执行命令的操作,并将其结果返回到连接。
  3. 根据您的定义,“连接”会/可以管理多个游标。
  4. 您认为这是访问数据库的首选/高效方式,因为“连接”很昂贵,“游标”很便宜。
  5. 然而:

    1. MySQL(和其他RDMS)中的cursor不是用于执行操作的用户可访问机制。 MySQL(和其他人)以“set”的形式执行操作,或者更确切地说,他们将SQL命令编译成内部命令列表,并根据SQL命令的性质和表结构执行大量复杂的操作。
    2. cursor是一种特定的机制,在存储过程中使用(仅限于此),为开发人员提供了一种以程序方式处理数据的方法。
    3. MySQL中的“连接”就是你所谓的“游标”。 MySQL不会将它作为迭代器或指针暴露给它的内部结构,它只是在表上移动。它将它的内部结构暴露为接受SQL和其他命令的“连接”,将这些命令转换为内部动作,执行该操作,并将结果返回给您。
    4. 这是'set'和'procedural'执行风格之间的区别(这实际上是关于你,用户,给予访问权限的控制的粒度,或者至少是RDMS如何提取的固有粒度)当它通过API暴露它们时它的内部结构。)

答案 1 :(得分:2)

正如你所说,MySQL连接很便宜,所以对于你的情况,我不确定在代码组织和流程之外是否存在技术优势。管理两个游标可能比通过精心跟踪SQL'USE'语句来跟踪单个游标当前正在与之交谈的数据库更容易。其他数据库的里程可能会有所不同 - 请记住,Django努力与数据库无关。

此外,考虑两个不同数据库(即使在同一台服务器上)需要不同访问凭据的情况。在这种情况下,需要两个连接,以便每个连接都可以成功进行身份验证。

答案 2 :(得分:0)

每个数据库一个游标不一定是优选的,它只是默认行为。

基本原理是不同的数据库通常在不同的服务器上,使用不同的引擎,和/或需要不同的初始化选项。 (否则,你为什么要首先使用不同的“数据库”?)

在您的情况下,如果您的两个数据库只是表的名称空间(在SQL术语中应该称为“模式”)但是驻留在同一个MySQL实例上,那么无论如何都要使用单个连接。 (如何配置Django这样做实际上是一个完全不同的问题。)

如果您只有一个线程并且实际上不需要同时拥有两个数据库工作者,那么单个连接优于两个也是正确的。