Knex: Definir MySQL sql_mode na conexão do pool knex

Criado em 18 abr. 2016  ·  3Comentários  ·  Fonte: knex/knex

Oi,

gostaria de definir sql_mode para NO_ENGINE_SUBSTITUTION para ignorar o strict mode padrão no servidor MySQL v5.7.x

Pode-se verificar a variável sql_mode MySQL digitando SHOW VARIABLES LIKE 'sql_mode'; no console do cliente MySQL.

  • Padrão para servidor MySQL v5.6.x
    NO_ENGINE_SUBSTITUTION
  • Padrão para servidor MySQL v5.7.x
    ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

Minha solução atual era modificar a seção mysqld no arquivo /etc/mysql/my.cnf :
sql_mode='NO_ENGINE_SUBSTITUTION'

Eu gostaria de mantê-lo no nível de aplicativo da web, em vez de no nível do servidor de banco de dados. Todos os conselhos são apreciados.

Obrigado!

question

Comentários muito úteis

Olá @ rhys-vdw,

Não sei se é a maneira oficial de obter o resultado mencionado acima, no entanto, substituir a função afterCreate na seção pool das configurações de conexão resolve o problema para mim. Aqui está a fonte:

dbase: {
          client: 'mysql',
          connection: {
            socketPath: '/var/run/mysqld/mysqld.sock',
            database : 'db_name',
            user: 'db_username',
            password : 'db_password',
            timezone: 'UTC',
            charset: 'utf8mb4_unicode_ci',
            supportBigNumbers:true
          },
          pool: {
            min: 2,
            max: 10,
            afterCreate: function(conn, cb) {
              conn.query('SET sql_mode="NO_ENGINE_SUBSTITUTION";', function (err) {
                cb(err, conn);
              });
            }
          }
        }

Atenciosamente,
Luca

Todos 3 comentários

Olá @ rhys-vdw,

Não sei se é a maneira oficial de obter o resultado mencionado acima, no entanto, substituir a função afterCreate na seção pool das configurações de conexão resolve o problema para mim. Aqui está a fonte:

dbase: {
          client: 'mysql',
          connection: {
            socketPath: '/var/run/mysqld/mysqld.sock',
            database : 'db_name',
            user: 'db_username',
            password : 'db_password',
            timezone: 'UTC',
            charset: 'utf8mb4_unicode_ci',
            supportBigNumbers:true
          },
          pool: {
            min: 2,
            max: 10,
            afterCreate: function(conn, cb) {
              conn.query('SET sql_mode="NO_ENGINE_SUBSTITUTION";', function (err) {
                cb(err, conn);
              });
            }
          }
        }

Atenciosamente,
Luca

Obrigado @lanceschi , não respondi porque não tinha ideia de qual seria a solução. Eu me pergunto se valeria a pena acrescentar algo sobre este retorno de chamada ao FAQ?

O retorno de chamada é documentado, fechando

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

saurabhghewari picture saurabhghewari  ·  3Comentários

npow picture npow  ·  3Comentários

zettam picture zettam  ·  3Comentários

PaulOlteanu picture PaulOlteanu  ·  3Comentários

olaferlandsen picture olaferlandsen  ·  3Comentários