Ergebnis 1 bis 29 von 29

Thema: Neues Modul löst ständige Datenbank-Updates aus

  1. #1
    Contao-Nutzer
    Registriert seit
    12.08.2015.
    Beiträge
    89

    Standard Neues Modul löst ständige Datenbank-Updates aus

    Hallo zusammen,

    und schön hier zu sein - in euerer Community

    Jetzt zu meinem Problem:
    Habe ein Modul kreiert, das anhand der DCA-Config die tl_member-Tabelle um einige Felder erweitern und eine weitere Tabelle erzeugen soll.
    Jetzt merke ich, dass diese "ALTER table..." queries immerwieder unter "Erweiterungsverwaltung > Datenbank aktualisieren" auftauchen.
    Das selbe gilt auch im Install-Tool. Die Felder sind bereits generiert, aber Contao will immer wieder diese "CHANGEN". Beispiel:
    "ALTER TABLE `tl_member` CHANGE `contact_person` `contact_person` VARCHAR(255) NULL DEFAULT NULL;"

    Was stimmt da nicht oder was muss ich da noch beachten?

    Danke schon mal!

  2. #2
    Contao-Urgestein Avatar von the_scrat
    Registriert seit
    24.02.2010.
    Ort
    Augsburg
    Beiträge
    2.051
    User beschenken
    Wunschliste

    Standard

    Deine sql definition im dca ist falsch. Schau einfach wie andere dca Felder ein varchar angeben. Dann sollte das Db update durchgehen


    Gesendet von meinem iPhone mit Tapatalk
    Programmers don't comment their code. It was hard to write, it should be hard to understand...

  3. #3
    Contao-Nutzer
    Registriert seit
    12.08.2015.
    Beiträge
    89

    Standard

    Die Query, die ich als Beispiel^^ angegeben habe, ist ein Auszug aus Contao. Mein DCA sieht u.a. so aus:

    $GLOBALS['TL_DCA']['tl_member']['fields']['contact_person'] = array(
    'label' => &$GLOBALS['TL_LANG']['tl_member']['contact_person'],
    'exclude' => true,
    'search' => true,
    'inputType' => 'text',
    'eval' => array('feEditable' => true,'feViewable' => true, 'mandatory' => true, 'tl_class'=>'w50'),
    'sql' => 'varchar(255) null'
    );

    DIes hab ich aus aus der tl_member_DCA rauskopiert und umgeschrieben

  4. #4
    Contao-Urgestein Avatar von the_scrat
    Registriert seit
    24.02.2010.
    Ort
    Augsburg
    Beiträge
    2.051
    User beschenken
    Wunschliste

    Standard

    Zitat Zitat von joeker Beitrag anzeigen
    'sql' => 'varchar(255) null'
    Ich glaube aber nicht, dass das so in Contoa irgendwo vorkommt. Also kannst du das nicht kopiert haben!

    Ändere das ab in:
    PHP-Code:
    'sql'                     => "varchar(255) NOT NULL default ''" 
    Programmers don't comment their code. It was hard to write, it should be hard to understand...

  5. #5
    Contao-Nutzer
    Registriert seit
    12.08.2015.
    Beiträge
    89

    Standard

    Ja aber, ich möchte dieses Feld nicht als Pflichtfeld erzeugen.
    Kann es sein, dass es an der externen SQL-Datei liegt, denn manche Module besitzen von Haus aus im Config-Ordner eine SQL-Datei mit allen DB-Anpassungen, die ebenso in der DCA-Config vorhanden sind?

  6. #6
    Contao-Urgestein Avatar von the_scrat
    Registriert seit
    24.02.2010.
    Ort
    Augsburg
    Beiträge
    2.051
    User beschenken
    Wunschliste

    Standard

    lösch die .sql Datei, das ist eine technik, die in Contao2 verwendet wurde. In Contao 3 wird das SQL nur noch im DCA verwendet.

    Und ob ein Feld ein Pflichtfeld ist, oder nicht, entscheidet nicht das sql, sondern der Wert im eval()
    Programmers don't comment their code. It was hard to write, it should be hard to understand...

  7. #7
    Contao-Nutzer
    Registriert seit
    16.06.2015.
    Beiträge
    30

    Standard

    ohne default value kommt das Update

  8. #8
    Contao-Urgestein Avatar von the_scrat
    Registriert seit
    24.02.2010.
    Ort
    Augsburg
    Beiträge
    2.051
    User beschenken
    Wunschliste

    Standard

    Zitat Zitat von gri Beitrag anzeigen
    ohne default value kommt das Update
    ???????????????
    Programmers don't comment their code. It was hard to write, it should be hard to understand...

  9. #9
    Contao-Nutzer
    Registriert seit
    12.08.2015.
    Beiträge
    89

    Standard

    Jetzt hab ich das DCA für das eine Feld umgestellt und die SQL-Datei gelöscht:

    $GLOBALS['TL_DCA']['tl_member']['fields']['contact_person'] = array(
    'label' => &$GLOBALS['TL_LANG']['tl_member']['contact_person'],
    'exclude' => true,
    'search' => true,
    'inputType' => 'text',
    'eval' => array('feEditable' => true,'feViewable' => true, 'mandatory' => true, 'tl_class'=>'w50'),
    'sql' => 'varchar(255) NOT NULL default ""'
    );

    Aber das Install-Tool will es immernoch ständig updaten.
    Und sorry, es soll doch ein Pflichtfeld sein - die darunter sind es nicht ('mandatory' => false)

  10. #10
    Contao-Urgestein Avatar von the_scrat
    Registriert seit
    24.02.2010.
    Ort
    Augsburg
    Beiträge
    2.051
    User beschenken
    Wunschliste

    Standard

    Sagmal was machst du da? Kopier doch jetzt einfach mal den String von oben!!!!

    PHP-Code:
    'sql'                     => "varchar(255) NOT NULL default ''" 
    Wieso ist in deinem die Anführungszeichen vertauscht. Außen sind einfache ' und der Defaultwert ist mit doppelten angegeben!
    Programmers don't comment their code. It was hard to write, it should be hard to understand...

  11. #11
    Contao-Nutzer
    Registriert seit
    12.08.2015.
    Beiträge
    89

    Standard

    Achso, ich dachte es spielt keine Rolle - zumindest nicht PHP-technisch.
    Ich wusste doch nicht, dass Contao das unterscheidet.

    Aber was mache ich dann für TEXT-Typen wie hier:

    $GLOBALS['TL_DCA']['tl_member']['fields']['company_description'] = array(
    'label' => &$GLOBALS['TL_LANG']['tl_member']['company_description'],
    'exclude' => true,
    'search' => true,
    'inputType' => 'textarea',
    'eval' => array('rte' => 'tinyMCE'),
    'sql' => "TEXT NOT NULL"
    );

    ...wo es keine default-Werte gibt?
    ...oder bei INT-Typen?

  12. #12
    Contao-Urgestein Avatar von the_scrat
    Registriert seit
    24.02.2010.
    Ort
    Augsburg
    Beiträge
    2.051
    User beschenken
    Wunschliste

    Standard

    Stimmt, PHP technisch ist es egal. Aber in einem CMS gibt es immer bestimmt Vorgaben die eingehalten werden müssen.

    Orientiere dich was das sql angeht am besten an den vorhandenen Erweiterungen bzw. dem Core
    Du findest die DCA vom Core in /system/modules/core/dca
    Such dort einfach nach 'textarea' dann findest du ganz schnell einen Beispielbereich und wie das sql dort angegeben wurde. Halte dich daran, so vermeidest du Fehler.

    Hier die Lösung.
    PHP-Code:
    'sql'                     => "text NULL" 
    Programmers don't comment their code. It was hard to write, it should be hard to understand...

  13. #13
    Contao-Nutzer
    Registriert seit
    16.06.2015.
    Beiträge
    30

    Standard

    @ scrat

    ich meinte damit wenn beim SQLstring
    PHP-Code:
    'sql'                     => "varchar(255) NOT NULL default ''" 
    der Defaultwert fehlt......wie im geposteten Beispiel des Threaderstellers.

  14. #14
    Contao-Nutzer
    Registriert seit
    12.08.2015.
    Beiträge
    89

    Standard

    Ok danke dir vielmals.

    Nur trotzdem wundert es mich, wenn ältere Module (die mit 3.5 kompatibel sind) ohne der vorhandenen SQL-Datei auch so einen Loop erzeugen und sich immer wieder kreieren wollen.
    Naja, muss man wohl nicht verstehen :P


    Danke nochmals

  15. #15
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.114
    Partner-ID
    10107

    Standard

    varchar(255) NULL ist eigentlich korrekt, aber es kann sein dass Contao dies falsch erkennt. Hast du's schon mal mit groß geschriebenem NULL probiert?

  16. #16
    Contao-Nutzer
    Registriert seit
    12.08.2015.
    Beiträge
    89

    Standard

    Sorry, dass ich so spät erst antworte.

    Das Problem waren die großgeschriebennen SQL-Kommandos - hast du also ganz recht.
    Conao ist da etwas pingelig - und wie es aussieht case-sensitive was die queries anbetrifft

  17. #17
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.114
    Partner-ID
    10107

    Standard

    Die case sensitivity hängt vom MySQL Server bzw. dessen Einstellungen ab.

  18. #18
    Contao-Nutzer
    Registriert seit
    12.08.2015.
    Beiträge
    89

    Standard

    Ja aber wieso funktionieren bei mir gewöhnliche Queries mit PHP?
    Ich hatte sonst nie Probleme mit Groß- und Kleinschreibung.

  19. #19
    Wandelndes Contao-Lexikon Avatar von BugBuster
    Registriert seit
    15.06.2009.
    Ort
    Berlin
    Beiträge
    10.513
    User beschenken
    Wunschliste

    Standard

    Weil Contao in dem Fall folgendes tut:
    1: er besitzt ein DCA Extractor der die SQL Definitionen da raus nimmt.
    2. er liest die Struktur aus der bestehenden Tabelle aus.

    Das wird dann verglichen und wenn nicht identisch, dann wird er mit "alter table..." reagieren.

    Das war damals bei der database.sql ähnlich, auch da kam es drauf an was groß- und was klein-geschrieben wurde.
    Geändert von BugBuster (18.08.2015 um 12:21 Uhr)
    Grüße, BugBuster
    "view source" is your guide.
    Danke an alle Amazon Wunschlisten Erfüller

  20. #20
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.114
    Partner-ID
    10107

    Standard

    Zitat Zitat von joeker Beitrag anzeigen
    Ja aber wieso funktionieren bei mir gewöhnliche Queries mit PHP?
    Ich hatte sonst nie Probleme mit Groß- und Kleinschreibung.
    Hm, beschreibe mal ein Beispiel.

  21. #21
    Contao-Nutzer
    Registriert seit
    12.08.2015.
    Beiträge
    89

    Standard

    @BugBuster:
    Danke für die Aufklärung. Ich merk schon - wenn ich immer länger mit Contao mich befasse, lerne ich wie Contao zu denken

    @Spooky:
    Ein Beispiel wäre zu Beispiel:

    \Database::getInstance()->query("ALTER TABLE 'so-und-so' CHANGE COLUMN dings INT(1) NULL DEFAULT 'bums' ");

    Da würde Contao schon meckern, dass "default" groß geschrieben ist.

  22. #22
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.114
    Partner-ID
    10107

    Standard

    Ok, eine ALTER TABLE query habe ich his jetzt noch nie über das Datenbank Interface von Contao abgesetzt, wusste nicht, dass dort Contao auch noch irgendwas überprüft.

    Was für ein Fehler kommt da genau?

  23. #23
    Contao-Urgestein
    Registriert seit
    29.10.2009.
    Ort
    Magdeburg
    Beiträge
    2.020
    Partner-ID
    626
    User beschenken
    Wunschliste

    Standard

    Zitat Zitat von joeker Beitrag anzeigen
    @BugBuster:
    Danke für die Aufklärung. Ich merk schon - wenn ich immer länger mit Contao mich befasse, lerne ich wie Contao zu denken

    @Spooky:
    Ein Beispiel wäre zu Beispiel:

    \Database::getInstance()->query("ALTER TABLE 'so-und-so' CHANGE COLUMN dings INT(1) NULL DEFAULT 'bums' ");

    Da würde Contao schon meckern, dass "default" groß geschrieben ist.
    Nein, würde es nicht. Nur beim Abgleich zwischen den vorhandenen Datenbankdefinitionen und den erforderlichen ist Contao pingelig. Da werden alle Informationen in zwei Arrays geschrieben und miteinander verglichen. Wenn sich etwas unterscheidet, geht Contao davon aus, dass es geändert werden sollte. Es "normalisiert" dabei nicht die Informationen, die der Entwickler im DCA/database.sql hinterlegt.

  24. #24
    Contao-Nutzer
    Registriert seit
    12.08.2015.
    Beiträge
    89

    Standard

    Wenn wir schon bei Datenbanken sind - wie sage ich Contao anhand meines Models in meinem Custom-Modul, dass auf andere Tabellen beziehen soll?
    Oder wird es ausschließlich mit DCA realisiert - und wenn ja wie?

  25. #25

  26. #26
    Contao-Nutzer
    Registriert seit
    12.08.2015.
    Beiträge
    89

    Standard

    Ja das habe ich mir schon gedacht und ausprobiert.
    Bei 1:n Beziehungen geht es wudnerbar - doch bei m:n wird es etwas tricky und leicht undurchsichtig, da man immer eine "pid"-Spalte in jeder Tabelle haben muss und Contao keine "direkte" SQL-ForeignKey Beziehung aufbaut.

    Da musste ich mich behelfen und Custom-Methoden in mein Model einbauen, um diese per InnerJoin zu koppeln.

  27. #27
    Contao-Nutzer
    Registriert seit
    07.12.2009.
    Beiträge
    151

    Standard

    Schau dir dazu am Besten mal die Extension Haste an. Die unterstützt auch m:n-Beziehungen

  28. #28
    Contao-Nutzer
    Registriert seit
    12.08.2015.
    Beiträge
    89

    Standard

    Ok danke. Ich wusste gar nicht, dass Haste so etwas kann. Und das, obwohl ich das Ding bei eingerichtet habe :P

  29. #29
    Contao-Nutzer
    Registriert seit
    17.10.2014.
    Beiträge
    72

    HTML

    Zitat Zitat von webstar Beitrag anzeigen
    Nein, würde es nicht. Nur beim Abgleich zwischen den vorhandenen Datenbankdefinitionen und den erforderlichen ist Contao pingelig. Da werden alle Informationen in zwei Arrays geschrieben und miteinander verglichen. Wenn sich etwas unterscheidet, geht Contao davon aus, dass es geändert werden sollte. Es "normalisiert" dabei nicht die Informationen, die der Entwickler im DCA/database.sql hinterlegt.
    Tipp: In \Contao\Database\Installer::compileCommands die Variable $sql_current ausgeben nachdem man das DB Update gemacht hat - da kann man ersehen, welches Format Contao erwartet.

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

Lesezeichen

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •