Alle Tabellen Weg bis auf die Plugin Tabelle

Hallo zusammen,

bei der Plugin Entwicklung möchte ich mein DB-Schema aktualisieren, falls die Tabelle bereits existiert.

Dazu habe ich folgende Code in meiner install-Methode:

$tool = new SchemaTool($this->container->get('models'));
$classes = [
   $this->container->get('models')->getClassMetadata(FfbSupplier::class)
];
$tool->updateSchema($classes);

Nach dem Aufruf von updateSchema sind alle Tabellen bis auf die Plugin Tabelle weg.

Die Methode updateSchemaSql

    /**
     * Updates the database schema of the given classes by comparing the ClassMetadata
     * instances to the current database schema that is inspected. If $saveMode is set
     * to true the command is executed in the Database, else SQL is returned.
     *
     * @param array $classes
     * @param boolean $saveMode
     *
     * @return void
     */
    public function updateSchema(array $classes, $saveMode = false)
    {
        $updateSchemaSql = $this->getUpdateSchemaSql($classes, $saveMode);
        var_dump($updateSchemaSql);die();

gibt mir ein Array mit 290 Einträgen zurück.

Hier ein Auschnitt, man sieht die Drop Table Befehle drin:

array(290) {
  string(28) "DROP TABLE s_core_subscribes"
  [183]=>
  string(21) "DROP TABLE s_core_tax"
  [184]=>
  string(27) "DROP TABLE s_core_tax_rules"
  [185]=>
  string(27) "DROP TABLE s_core_templates"
  [186]=>
  string(43) "DROP TABLE s_core_templates_config_elements"
  [187]=>
  string(41) "DROP TABLE s_core_templates_config_layout"
  [188]=>
  string(38) "DROP TABLE s_core_templates_config_set"
  [189]=>
  string(41) "DROP TABLE s_core_templates_config_values"
  [190]=>
  string(32) "DROP TABLE s_core_theme_settings"
  [191]=>
  string(30) "DROP TABLE s_core_translations"
  [192]=>
  string(23) "DROP TABLE s_core_units"
  [193]=>
  string(30) "DROP TABLE s_core_widget_views"
  [194]=>
  string(25) "DROP TABLE s_core_widgets"
  [195]=>
  string(20) "DROP TABLE s_crontab"
  [196]=>
  string(31) "DROP TABLE s_emarketing_banners"
  [197]=>
  string(42) "DROP TABLE s_emarketing_banners_attributes"
  [198]=>
  string(42) "DROP TABLE s_emarketing_banners_statistics"
  [199]=>
  string(36) "DROP TABLE s_emarketing_lastarticles"
  [200]=>
  string(31) "DROP TABLE s_emarketing_partner"
  [201]=>
  string(42) "DROP TABLE s_emarketing_partner_attributes"
  [202]=>
  string(31) "DROP TABLE s_emarketing_referer"
  [203]=>
  string(35) "DROP TABLE s_emarketing_tellafriend"
  [204]=>
  string(37) "DROP TABLE s_emarketing_voucher_codes"
  [205]=>
  string(32) "DROP TABLE s_emarketing_vouchers"
  [206]=>
  string(43) "DROP TABLE s_emarketing_vouchers_attributes"
  [207]=>
  string(20) "DROP TABLE s_emotion"
  [208]=>
  string(31) "DROP TABLE s_emotion_attributes"
  [209]=>
  string(31) "DROP TABLE s_emotion_categories"
  [210]=>
  string(28) "DROP TABLE s_emotion_element"
  [211]=>
  string(34) "DROP TABLE s_emotion_element_value"
  [212]=>
  string(38) "DROP TABLE s_emotion_element_viewports"
  [213]=>
  string(26) "DROP TABLE s_emotion_shops"
  [214]=>
  string(30) "DROP TABLE s_emotion_templates"
  [215]=>
  string(23) "DROP TABLE s_es_backlog"
  [216]=>
  string(19) "DROP TABLE s_export"
  [217]=>
  string(28) "DROP TABLE s_export_articles"
  [218]=>
  string(30) "DROP TABLE s_export_attributes"
  [219]=>
  string(30) "DROP TABLE s_export_categories"
  [220]=>
  string(29) "DROP TABLE s_export_suppliers"
  [221]=>
  string(19) "DROP TABLE s_filter"
  [222]=>
  string(28) "DROP TABLE s_filter_articles"
  [223]=>
  string(30) "DROP TABLE s_filter_attributes"
  [224]=>
  string(27) "DROP TABLE s_filter_options"
  [225]=>
  string(38) "DROP TABLE s_filter_options_attributes"
  [226]=>
  string(29) "DROP TABLE s_filter_relations"
  [227]=>
  string(26) "DROP TABLE s_filter_values"
  [228]=>
  string(37) "DROP TABLE s_filter_values_attributes"
  [229]=>
  string(30) "DROP TABLE s_library_component"
  [230]=>
  string(36) "DROP TABLE s_library_component_field"
  [231]=>
  string(18) "DROP TABLE s_media"
  [232]=>
  string(24) "DROP TABLE s_media_album"
  [233]=>
  string(33) "DROP TABLE s_media_album_settings"
  [234]=>
  string(30) "DROP TABLE s_media_association"
  [235]=>
  string(29) "DROP TABLE s_media_attributes"
  [236]=>
  string(30) "DROP TABLE s_multi_edit_backup"
  [237]=>
  string(30) "DROP TABLE s_multi_edit_filter"
  [238]=>
  string(29) "DROP TABLE s_multi_edit_queue"
  [239]=>
  string(38) "DROP TABLE s_multi_edit_queue_articles"
  [240]=>
  string(18) "DROP TABLE s_order"
  [241]=>
  string(29) "DROP TABLE s_order_attributes"
  [242]=>
  string(25) "DROP TABLE s_order_basket"
  [243]=>
  string(36) "DROP TABLE s_order_basket_attributes"
  [244]=>
  string(33) "DROP TABLE s_order_billingaddress"
  [245]=>
  string(44) "DROP TABLE s_order_billingaddress_attributes"
  [246]=>
  string(30) "DROP TABLE s_order_comparisons"
  [247]=>
  string(26) "DROP TABLE s_order_details"
  [248]=>
  string(37) "DROP TABLE s_order_details_attributes"
  [249]=>
  string(28) "DROP TABLE s_order_documents"
  [250]=>
  string(39) "DROP TABLE s_order_documents_attributes"
  [251]=>
  string(22) "DROP TABLE s_order_esd"
  [252]=>
  string(26) "DROP TABLE s_order_history"
  [253]=>
  string(24) "DROP TABLE s_order_notes"
  [254]=>
  string(25) "DROP TABLE s_order_number"
  [255]=>
  string(34) "DROP TABLE s_order_shippingaddress"
  [256]=>
  string(45) "DROP TABLE s_order_shippingaddress_attributes"
  [257]=>
  string(35) "DROP TABLE s_plugin_recommendations"
  [258]=>
  string(33) "DROP TABLE s_plugin_widgets_notes"
  [259]=>
  string(29) "DROP TABLE s_premium_dispatch"
  [260]=>
  string(40) "DROP TABLE s_premium_dispatch_attributes"
  [261]=>
  string(40) "DROP TABLE s_premium_dispatch_categories"
  [262]=>
  string(39) "DROP TABLE s_premium_dispatch_countries"
  [263]=>
  string(38) "DROP TABLE s_premium_dispatch_holidays"
  [264]=>
  string(42) "DROP TABLE s_premium_dispatch_paymentmeans"
  [265]=>
  string(29) "DROP TABLE s_premium_holidays"
  [266]=>
  string(34) "DROP TABLE s_premium_shippingcosts"
  [267]=>
  string(28) "DROP TABLE s_product_streams"
  [268]=>
  string(37) "DROP TABLE s_product_streams_articles"
  [269]=>
  string(39) "DROP TABLE s_product_streams_attributes"
  [270]=>
  string(38) "DROP TABLE s_product_streams_selection"
  [271]=>
  string(27) "DROP TABLE s_schema_version"
  [272]=>
  string(26) "DROP TABLE s_search_fields"
  [273]=>
  string(25) "DROP TABLE s_search_index"
  [274]=>
  string(28) "DROP TABLE s_search_keywords"
  [275]=>
  string(26) "DROP TABLE s_search_tables"
  [276]=>
  string(42) "DROP TABLE s_statistics_article_impression"
  [277]=>
  string(36) "DROP TABLE s_statistics_currentusers"
  [278]=>
  string(28) "DROP TABLE s_statistics_pool"
  [279]=>
  string(31) "DROP TABLE s_statistics_referer"
  [280]=>
  string(30) "DROP TABLE s_statistics_search"
  [281]=>
  string(32) "DROP TABLE s_statistics_visitors"
  [282]=>
  string(17) "DROP TABLE s_user"
  [283]=>
  string(27) "DROP TABLE s_user_addresses"
  [284]=>
  string(38) "DROP TABLE s_user_addresses_attributes"
  [285]=>
  string(28) "DROP TABLE s_user_attributes"
  [286]=>
  string(32) "DROP TABLE s_user_billingaddress"
  [287]=>
  string(43) "DROP TABLE s_user_billingaddress_attributes"
  [288]=>
  string(33) "DROP TABLE s_user_shippingaddress"
  [289]=>
  string(44) "DROP TABLE s_user_shippingaddress_attributes"
}

Ist es ein SW-Bug oder mache ich hier komplett etwas falsch?

Hi,

das ist kein SW-Bug: Wenn du nur eine Klasse / ein Schema angibst und den SaveMode nicht nutzt, gleicht Doctrine das neue Schema und das alte Schema ab - in dem Fall beinhaltet das neue Schema nur deine eine Klasse. Daher die Drops.

Du kannst jetzt entweder alle Schemata angeben (also auch die von anderen Tabellen) oder den SaveMode nutzen  - bei dem werden keine Drops vorgenommen. 

Besten Gruß,

Daniel

 

1 Like

Hallo Daniel,

vielen Dank für die schnelle Rückmeldung.

Puhh ganz schön gefährlich SaveMode standardmäßig auf false zu lassen…

Der Weg mit der Angabe aller Tabellen kann ich nicht gehen, da ich ja sonst immer, wenn Tabellen dazu kommen diese erweitern muss.

Alternativ könnte ich mir per Query alle Tabellen zurückgeben und diese an die Methode übergeben.

Ich setze aber etstmal SaveMode auf true.

Danke noch mal.

@A_Scheider schrieb:

Hallo Daniel,

vielen Dank für die schnelle Rückmeldung.

Puhh ganz schön gefährlich SaveMode standardmäßig auf false zu lassen…

Der Weg mit der Angabe aller Tabellen kann ich nicht gehen, da ich ja sonst immer, wenn Tabellen dazu kommen diese erweitern muss.

Alternativ könnte ich mir per Query alle Tabellen zurückgeben und diese an die Methode übergeben.

Ich setze aber etstmal SaveMode auf true.

Danke noch mal.

 Moin,

den SaveMode zu benutzen ist garkein Problem - nehm den einfach.

Allerdings gilt es dazu zu sagen, dass wir den SchemaManager nicht mehr für das Erstellen / Updaten von Tabellen nutzen, da es hierbei zu Kollations-Problemen kommen kann.
Wir hatten mehrfach den Fall bei diversen Kunden, dass Doctrine die Tabellen dadurch mit einer falschen Kollation anlegt / updatet und das kann dann zu ungewünschten Fehlern führen: “Illegal mix of collations”.

Sofern du also ein Plugin zum Verkauf in unserem Store schreibst, könnte das bei diversen Kunden-Servern zu Problemen führen.
In diesem Fall bleibt dir die unbequemere Alternative die Tabellen selbst per SQL anzulegen - funktioniert dann aber zuverlässig.
Für den Privat-Gebrauch ist das natürlich etwas Anderes.

Gruß,
Patrick  Shopware

1 Like

Hallo,

Wisst ihr vielleicht schon genaueres bezüglich des Issues mit dem SchemaTool? Ich nutze das recht häufig in meinen Plugins, konnte bisher aber noch kein Problem feststellen. Auch in der Doctrine Doku oder im Netz wurde ich bislang nicht fündig.

Bin Euch für jeden Tipp dankbar…

Liebe Grüße!

@Synonymous schrieb:

Hallo,

Wisst ihr vielleicht schon genaueres bezüglich des Issues mit dem SchemaTool? Ich nutze das recht häufig in meinen Plugins, konnte bisher aber noch kein Problem feststellen. Auch in der Doctrine Doku oder im Netz wurde ich bislang nicht fündig.

Bin Euch für jeden Tipp dankbar…

Liebe Grüße!

Das Problem ist wohl, dass es eine Standard-Koallation der der Datenbank gibt. Shopware setzt bei den eigenen Tabellen explizit  utf8_unicode_ci. Wenn jetzt bspw. das Plugin eine Spalte anlegt, wird der Standard der Datenbank genommen, der bspw. bei einigen Kunden bspw. utf8_general_ci ist. Wenn du nun einen Vergleich zwischen einer Spalte aus dem Core und dieser neuen Spalte machst, wird ein SQL-Fehler “Illegal Mix of Coallation” auftreten.

Gibt dazu auch ein Ticket: Shopware Issuetracker

 

2 Likes