【问题标题】:Given a query, how do I find the ORM method that generated it?给定一个查询,我如何找到生成它的 ORM 方法?
【发布时间】:2015-06-01 04:51:55
【问题描述】:

我们在多个项目中同时使用 Cake 和 Symfony,以及 Doctrine ORM。我们的代码库中很少有地方在代码中写出实际的 SQL 查询——我们让 ORM 库完成繁重的工作。

现在,我的 IT 人员从 MySQL 慢查询日志中给了我 100mb 的文件,我需要找到创建此查询的位置。我已经在代码库中针对特定字段尝试了各种递归 grep,并提出了数十个(如果不是数百个)文件,或者空手而归。例如:

cd ~/webproject
grep -r -E 'field1.*field2.*field3' .

find . -name '*.php' -print | xargs grep -E 'field1.*field2.*field3'

您有什么更好的建议、技巧或技术可用于追踪与特定最终“渲染”SQL 语句相关的文件、控制器或 ORM 模型方法?

【问题讨论】:

    标签: php mysql symfony orm doctrine-orm


    【解决方案1】:

    这是一个你可以使用的技巧。我不熟悉 Doctrine 或 Cake ORM,但可以很容易地用一般术语来描述它 - 我使用 Propel,我确信它可以做到这一点。

    只需将自定义WHERE 子句添加到您的所有查询中,如下所示(根据需要替换您自己的方法名称)。 1 = 1 实际上是一个空操作,本身不应该影响查询性能,并且可以让您在方便的评论中走私:

    $query->addCustomWhere(
        '1 = 1 /* ' . __CLASS__ . '::' . __FUNCTION__ . ' */'
    );
    

    然后,您记录的所有查询都将在注释中在它们旁边显示类/函数。当然,您可以为此编写一个辅助方法,只需传入查询和魔术变量,就不必每次都写出来。

    【讨论】:

    • 这对于开发环境来说实际上是一个相当不错的技巧,但不幸的是,我不允许将 SQL 中的代码 cmets 部署到我的生产服务器。这种“技巧”永远不会通过我工作的代码审查。我希望以某种方式在代码库中找到模型方法。
    • @phpguru:在我看来,不允许评论代码是可笑的。这样做的重点是添加生产中发生的事情的记录(即永久保存)。我认为,任何拒绝它的“审查”都忽略了代码审查的意义。
    • 我同意在某种意义上这是可笑的。也就是说,如果您在符合 PCI 标准的代码车间工作,其中每一行都经过审核员的严格审查,并且/或者您的服务器处于持续的高负载状态,同时削减存储空间、复制带宽和成本是主要目标,那么您的选择就很有限。您提出的建议会改变生产流程,而这通常是不允许的。想象一下 1TB/天的复制日志增加到 1.25TB/天,并尝试向董事会证明这是合理的。这种帮助?我需要检查代码,而不是日志。
    • 听起来你的双手有些束缚,@phpguru。就我个人而言,我会尝试过滤日志(或创建第二个日志流),以便保留不超过几个小时的附加 cmets(或者需要很长时间才能可靠地等待慢速查询发生)。这将使您的日志增长保持不变。不幸的是,我认为没有什么神奇的搜索方法,除了显而易见的:检查查询并猜测会使用哪些查找器子句。对不起!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-08
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 2020-05-18
    • 2013-04-15
    相关资源
    最近更新 更多