4

对于我认为是一个常见问题,在中等数量的搜索后没有返回任何内容。我有几个 mysql 服务器,上面有不同的表,每个服务器要么是主服务器,要么是读取从服务器。我想通过读取从属设备和所有其他 INSERT、UPDATE、ALTER 等路由所有 SELECT 和其他非表修改查询。到一个主人,并确保正确的主从组合实际上有我要问的表格。

TLDR基于表和查询类型(读取或写入)我想使用不同的 mysql 连接。

为了以一种干净的方式做到这一点,我正在制作一个包装函数,它将检查查询并决定使用哪个连接。在这个函数中将是关于哪些表在哪些服务器上以及哪些是读取的从属或主控的详细信息。我将传入的只是一个包含 sql 语句的字符串。我知道如何使用正则表达式来实现这一点,但如果存在一个内置函数来解释 SQL 语法的任何可变性或我不知道的语句类型的可能性,我更愿意使用它。

TLDR有没有比正则表达式更好的方法来从 sql 查询的字符串中获取表名和查询类型?什么是读取类型 sql 操作的详尽列表?有没有人已经有一个好的正则表达式来查找所有 SQL 查询变体的 sql 语句部分?

我想很多人在设置他们的系统时都遇到过类似的问题,至少他们中的一些人以类似的方式解决了这个问题。对任何这些方向的帮助将不胜感激。谢谢你的时间。

4

2 回答 2

1

DoctrinePropel这样的 ORM处理这种情况的方式是将每个表与一个连接相关联,然后使用查询对象来构建生成的 SQL。

例如,要SELECT在 Doctrine 中构建查询,您可能会执行以下操作:

$users = UserTable::getInstance()
  ->createQuery()                      // SELECT is the default operation.
  ->andWhere('is_active = ?', $active)
  ->fetch();

如果您使用一个类以这种方式以分段方法为您构建查询,那么确定操作的性质和查询的主表是相当简单的。

于 2012-05-12T22:51:47.453 回答