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

Dhr*_*hak 6 python mysql django mysql-python

示例场景:

MySQL运行单个服务器 - > HOSTNAME

该服务器上有两个MySQL数据库 - > USERS,GAMES.

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

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

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

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

Jac*_*edd 9

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

但是,答案越长:

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

然而:

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