Knex: Définir MySQL sql_mode sur la connexion au pool knex

Créé le 18 avr. 2016  ·  3Commentaires  ·  Source: knex/knex

Salut,

Je voudrais définir sql_mode sur NO_ENGINE_SUBSTITUTION afin de contourner la valeur par défaut strict mode dans le serveur MySQL v5.7.x

On peut vérifier la variable sql_mode MySQL en tapant SHOW VARIABLES LIKE 'sql_mode'; depuis la console client MySQL.

  • Valeur par défaut pour le serveur MySQL v5.6.x
    NO_ENGINE_SUBSTITUTION
  • Valeur par défaut pour le serveur 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

Ma solution de contournement actuelle était de modifier la section mysqld dans le fichier /etc/mysql/my.cnf :
sql_mode='NO_ENGINE_SUBSTITUTION'

Je voudrais le garder au niveau de l'application Web plutôt qu'au niveau du serveur DB. Tous les conseils appréciés.

Merci!

question

Commentaire le plus utile

Salut @ rhys-vdw,

Je ne sais pas si c'est le moyen officiel d'obtenir le résultat mentionné ci-dessus, mais le remplacement de la fonction afterCreate dans la section pool des paramètres de connexion fait l'affaire pour moi. Voici la source:

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);
              });
            }
          }
        }

Meilleures salutations,
Luca

Tous les 3 commentaires

Salut @ rhys-vdw,

Je ne sais pas si c'est le moyen officiel d'obtenir le résultat mentionné ci-dessus, mais le remplacement de la fonction afterCreate dans la section pool des paramètres de connexion fait l'affaire pour moi. Voici la source:

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);
              });
            }
          }
        }

Meilleures salutations,
Luca

Merci @lanceschi , je n'ai pas répondu car je n'avais aucune idée de la solution. Je me demande s'il vaudrait la peine d'ajouter quelque chose à propos de ce rappel à la FAQ?

Le rappel est documenté, fermeture

Cette page vous a été utile?
0 / 5 - 0 notes