Contao Tipps
Korrekte database.sql erzeugen
Viele Entwickler werden wahrscheinlich das Problem haben, dass ihre Modultabellen zwar korrekt erzeugt werden sich aber trotzdem nach der Installation immer noch in der Sektion "Update Database" wiederfinden. Meist liegt das an den implizierten Defaultwerten die von Mysql automatisch erzeugt werden.
Damit die Tabellen nicht mehr in dieser Sektion erscheinen macht einfach folgendes, nachdem die Tabelle einmal korrekt angelegt worden ist:
- SQL Mode überprüfen. (Wird bei den meisten nicht relevant sein) Contao arbeitet unter MySQL nicht im Strictmodus, welcher Standardmäßig auch aus ist. Einfach im phpMyAdmin oder auf der Konsole eingeben und kontrollieren das der Wert leer ist:
Wenn nicht leer folgendes eingeben:SHOW VARIABLES LIKE 'sql_mode';SET sql_mode = ''; - Nun lassen wir uns das create statement zurückgeben:
MODULE_TABLE_NAME müsst ihr natürlich durch den Tabellen Namen ersetzen.SHOW CREATE TABLE tl_MODULE_TABLE_NAME
Leider funktioniert das nicht ganz bei Feldern die NULL sein dürfen, Beispiel:
`price` decimal(20,4) NULL ,`price2` double(255,0) NULL
MySQL gibt nach obigem Beispiel zurück:
`price` decimal(20,4) default NULL,`price2` double(255,0) default NULL
Beides akzeptiert Contao aber nicht. Dafür die vollständige Variante:
`price` decimal(20,4) NULL default NULL,`price2` double(255,0) NULL default NULL
Andererseits auch einfach zu merken, immer den vollständigen Syntax nehmen:
NAME TYP[(WIDTH, PRECISION, SCALE)] [NOT] NULL default VALUE
Ein SQL CREATE Statement mit einigen meist gebrauchten Kombinationen:
CREATE TABLE `tl_sqltest` (
`id` int(10) unsigned NOT NULL auto_increment,
`pid` int(10) unsigned NOT NULL default '0',
`sorting` int(10) unsigned NOT NULL default '0',
`tstamp` int(10) unsigned NOT NULL default '0',
`decimal_demo1` decimal(20,4) NOT NULL default '100.0000',
`decimal_demo2` decimal(20,0) NOT NULL default '100',
`float_demo` float(9,2) unsigned NOT NULL default '0.00',
`varchar_demo1` varchar(32) NOT NULL default 'demo',
`varchar_demo2` varchar(64) NOT NULL default '',
`char_demo1` char(1) NOT NULL default 'A',
`char_demo2` char(1) NOT NULL default '',
`text_demo1` text NOT NULL,
`int_null_demo` int(10) NULL default NULL,
`decimal_null_demo` decimal(20,4) NULL default NULL,
`float_null_demo` float(9,2) unsigned NULL default NULL,
`varchar_null_demo` varchar(32) NULL default NULL,
`char_null_demo` char(1) NULL default NULL,
`text_null_demo` text NULL,
`timestamp_demo` timestamp NULL default NULL,
`date_demo` date NOT NULL default '1999-01-01'
PRIMARY KEY (`id`),
UNIQUE KEY `varchar_demo1` (`varchar_demo1`),
KEY `pid` (`pid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
- bei PRIMARY KEY müssen 2 Leerzeichen folgen bevor die runde Klammer folgt
- blob/text Felder (auch die Untertypen tinytext,...) dürfen laut MySQL keinen Default Wert haben, daher ist es hier richtig diesen wegzulassen.
- der Name des Unique Keys und des normalen Keys muss identisch sein mit dem Feldnamen der in Klammern steht.
- ein Key der über mehrere Felder angelegt werden könnte, wird von TL nicht akzeptiert (funktioniert aber)
Aktueller Thread dazu: http://www.contao-community.de/showthread.php?t=41
Der database.sql Generator
Nachdem man nun das Grundprinzip verstanden hat, ist man aber doch froh, wenn einem die Arbeit abgenommen wird.
Dazu dient das Modul: "database.sql Generator".