【问题标题】:Set sql_mode in CakePHP Schema在 CakePHP Schema 中设置 sql_mode
【发布时间】:2015-01-08 17:59:00
【问题描述】:

运行Console\cake schema create时,CakePHP 设置 MySQL 的 SQL 模式的方法是什么?

非 CakePHP 等效项是使用 PDO::MYSQL_ATTR_INIT_COMMAND 参数在 PDO 构造函数中运行此查询:

SET @@SESSION.sql_mode='TRADITIONAL,NO_AUTO_VALUE_ON_ZERO';

【问题讨论】:

    标签: php mysql cakephp cakephp-2.0


    【解决方案1】:

    您可以配置数据库源。

    $config['flags'] = [
         PDO::MYSQL_ATTR_INIT_COMMAND => "SET @@SESSION.sql_mode='TRADITIONAL,NO_AUTO_VALUE_ON_ZERO';"
    ];
    

    MySQL 驱动类的See the connect() methods code

    但是当您同时使用$config['encoding'] 时,这可能是个问题...参见第 163 行。:( 这需要在核心中进行修复。

    但是你可以扩展这个类(MysqlExtended 或类似的东西)并根据需要改变它并使用它。只需重载 connect() 方法。然后使用此驱动程序代替原始驱动程序进行连接。

    【讨论】:

    • 谢谢。我想这已经为 CakePHP 3 重写了,但我会被 2.x 卡住很长时间。无论如何,您认为可以从AppSchema 运行查询吗?我一直在玩before() 钩子和ConnectionManager::getDataSource($this->connection)->fetchAll(),但我无法正确了解细节。
    • 哦,忘了我评论的最后一部分。这个项目(不是我开始的)实际上有三个不同的AppSchema。我在测试错误的。
    • 就像我说的,只需扩展驱动程序类并为其设置数据库连接配置。然后将它与您的架构一起使用,请参阅:api.cakephp.org/2.5/source-class-CakeSchema.html#52 如果您只想运行查询,您可以使用 Model::query() 或 DboSource::execute()。
    • 感谢您的DboSource::execute() 提示,我不知道该方法存在,因为我依赖于我的 IDE 代码完成...这解决了我的确切需求;我已经编写了一个正确的答案以在将来帮助其他人。但请保留您的答案,扩展 DboSource 的提示对于为整个应用设置 SQL 模式看起来很有用。
    【解决方案2】:

    您可以创建/编辑AppSchema 构造函数(注意您的项目中可能有多个实例),获取数据源并执行查询:

    class AppSchema extends CakeSchema {
        public function __construct($options = array()) {
            $db = ConnectionManager::getDataSource($this->connection);
            $db->execute("SET @@SESSION.sql_mode='TRADITIONAL,NO_AUTO_VALUE_ON_ZERO'");
            parent::__construct($options);
        }
    }
    

    这将使用所需的 SQL 模式加载您的架构。更具体地说,它不会为应用程序本身强制执行给定的 SQL 模式。

    可能的用例:

    • 严格进行早期错误检测

      SET @@SESSION.sql_mode='TRADITIONAL,NO_AUTO_VALUE_ON_ZERO'
      
    • 放松设置以加载不完整的样本数据

      SET @@SESSION.sql_mode=''
      

    更一般地说,您可以(我建议您这样做)通过在app/Config/database.php 处编辑DATABASE_CONFIG 类中的相应属性来全局更改整个连接的SQL 模式:

    class DATABASE_CONFIG {
        public $default = array(
            'datasource' => 'Database/Mysql',
            // …
            'settings' => array(
                '@@SESSION.sql_mode' => "'TRADITIONAL,NO_AUTO_VALUE_ON_ZERO'",
            ),
        );
    }
    

    【讨论】:

    • 我正在使用 CakePhp 2.3 并且我坚持使用这种严格的方法。我的服务器是共享的。这样我就没有 phpMyAdmin 根权限。 “DATABASE_CONFIG”在我的代码中不起作用。你能指导我吗
    • @NishalK.R DATABASE_CONFIG 怎么可能不起作用?你到底需要什么root权限?顺便说一句,PhpMyAdmin 是一个完全不同的应用程序。
    • 我尝试通过phpMyAdmin在服务器中全局设置sql_mode。它需要root权限才能做到这一点。我添加了DATABASE_CONFIG,就像你在database.php 中提到的那样。但它似乎不起作用。
    • @NishalK.R 是的,您需要特殊权限才能更改整个服务器的设置。但这似乎与这个问题无关。
    • 现在所做的是在AppController 中执行查询$db->query( "SET @@SESSION.sql_mode=''" );,它现在正在工作。但我觉得这不是标准方法。当我查看您在config 中定义的方法时,它似乎是标准的。但它在我的应用程序中不起作用。
    【解决方案3】:

    对于 app.php 中的 CakePHP 3,“数据源”部分,添加:

    'flags' => [
        PDO::MYSQL_ATTR_INIT_COMMAND => "SET @@SESSION.sql_mode='STRICT_ALL_TABLES,NO_ENGINE_SUBSTITUTION';"
    ]
    

    【讨论】:

      猜你喜欢
      • 2011-01-20
      • 2013-12-20
      • 2020-09-07
      • 1970-01-01
      • 2019-05-29
      • 2016-01-25
      • 2018-08-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多