flosy.info | Développement Web, Open source …

Nov/10

7

Un champ « default » qui provoque une exception !

L’une des classes de mon modèle dispose d’un attribut default. Voici un extrait du schéma qui montre l’élément en question.

Group:
  columns:
    id:        { type: integer, primary: true, autoincrement: true }
    name:      { type: string(255) }
    default:    { type: boolean }

Lors de la création du modèle l’erreur suivante apparaît :

$ symfony doctrine:build --all
...
>> doctrine  generating sql for models
>> doctrine  Generated SQL successfully for models
>> doctrine  creating tables
 
SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that
corresponds to your MySQL server version for the right syntax to use near 'default TINYINT(1), PRIMARY KEY(id)) ENGINE =
INNODB' at line 1. Failing Query: "CREATE TABLE group (id BIGINT AUTO_INCREMENT, name VARCHAR(255), default 
TINYINT(1), PRIMARY KEY(id)) ENGINE = INNODB". Failing Query: CREATE TABLE group (id BIGINT AUTO_INCREMENT, 
name VARCHAR(255), default TINYINT(1), PRIMARY KEY(id)) ENGINE = INNODB

Si nous observons le script SQL produit dans data/sql/schema.sql nous trouvons :

CREATE TABLE GROUP (id BIGINT AUTO_INCREMENT, name VARCHAR(255), DEFAULT TINYINT(1), PRIMARY KEY(id)) ENGINE = INNODB;

DEFAULT est un mot clé réservé aussi pour l’utiliser il nous faut échapper le nom du champ avec des backquotes.

Un ticket sur le trac du projet symfony explique ce problème (le ticket en question).

Nous utilisons la méthode configureDoctrine de ProjectConfiguration pour paramétrer doctrine.

class ProjectConfiguration extends sfProjectConfiguration
{
  public function setup()
  {
    $this->enablePlugins('sfDoctrinePlugin');
  }
 
  public function configureDoctrine(Doctrine_Manager $manager)
  {
    $manager->setAttribute(Doctrine::ATTR_QUOTE_IDENTIFIER, true);
  }
}

Cette fois le script SQL échappe les noms de champ.

CREATE TABLE `group` (`id` BIGINT AUTO_INCREMENT, `name` VARCHAR(255), `default` TINYINT(1), PRIMARY KEY(`id`)) ENGINE = INNODB;

Update

Dans le cas d’un nom de BDD avec un tiret, cette astuce est nécessaire (par exemple ma-bdd).

Related Posts:

· ·

No comments yet.

Leave a Reply

 

<<

>>

Theme Design by devolux.nh2.me