Magento2: So aktualisieren Sie das Datenbankschema

29

Ich arbeite an einem benutzerdefinierten Modul von Magento, in dem sich eine Setup\InstallSchema.phpDatei befindet, die zuvor installiert wurde. Ich habe einige weitere Datenbankfelder hinzugefügt, InstallSchema.phpdamit ich die Tabellenstruktur aktualisieren möchte, aber die Tabelle hat keine Änderungen übernommen.

Wie kann ich Schemaänderungen an der Datenbanktabelle anwenden?

Ich habe Prozess-CLI-Befehle zum Aktualisieren des Schemas, aber keinen Erfolg.

php bin/magento setup:db-schema:upgrade

und

php bin/magento setup:upgrade
Suresh Chikani
quelle
Sie können mit "php bin / magento module: uninstall" deinstallieren und Ihre Erweiterung erneut installieren. Ein weiterer Punkt , es ist UpgradeSchema.php wie zu überprüfen github.com/magento/magento2/commit/... Scheint , wie in diesem Moment hier ist keine saubere Erklärung , wie die Datenbank zu aktualisieren, so dass ich auch gespannt auf richtige Antwort suche hier
FireBear
@FireBear Appy unter Antwortcode?
Suresh Chikani
noch nicht ausprobiert, sieht aber laut Beispiel aus dem Katalog-Kernmodul korrekt aus github.com/magento/magento2/blob/…
FireBear
In den meisten Fällen liegt der Fehler daran, dass für die Klasse kein Namespace definiert wurde. Stellen Sie sicher, dass Sie einen Namespace für Ihre Klasse definiert haben.
Soukaina

Antworten:

48

Wenn Sie der vorhandenen Tabelle Ihres Moduls weitere Spalten hinzufügen möchten, können Sie Folgendes tun.

Schritt 1: Erstellen Sie UpgradeSchema.php im Setup-Ordner. Holen Sie sich eine Idee aus dem folgenden Code.

namespace Vendor\ModuleName\Setup;

use Magento\Framework\Setup\UpgradeSchemaInterface;
use Magento\Framework\Setup\ModuleContextInterface;
use Magento\Framework\Setup\SchemaSetupInterface;
class UpgradeSchema implements  UpgradeSchemaInterface
{
    public function upgrade(SchemaSetupInterface $setup,
                            ModuleContextInterface $context){
        $setup->startSetup();
        if (version_compare($context->getVersion(), '1.0.1') < 0) {

            // Get module table
            $tableName = $setup->getTable('table_name');

            // Check if the table already exists
            if ($setup->getConnection()->isTableExists($tableName) == true) {
                // Declare data
                $columns = [
                    'imagename' => [
                        'type' => \Magento\Framework\DB\Ddl\Table::TYPE_TEXT,
                        'nullable' => false,
                        'comment' => 'image name',
                    ],
                ];

                $connection = $setup->getConnection();
                foreach ($columns as $name => $definition) {
                    $connection->addColumn($tableName, $name, $definition);
                }

            }
        }

        $setup->endSetup();
    }
}

Schritt 2: Ändern Sie den setup_versionWert inmodule.xml

Schritt 3: Führen Sie den php bin/magento setup:upgradeBefehl über die CLI aus

Praful Rajput
quelle
1
Kannst du erklären, wie ich Primärschlüssel mithilfe eines Upgrade-Skripts hinzufügen kann? In meiner Tabelle haben 'customer_id', aber es ist kein Primärschlüssel, jetzt möchte ich es als Primärschlüssel hinzufügen.
Suresh Chikani
Ja, Sie können es mithilfe der modifyColumnByDdl () -Funktion ändern. Es folgt das Schema. `public function modifyColumn ($ tableName, $ columnName, $ definition, $ flushData = false, $ schemaName = null);`
Praful Rajput
Wie kann ich das Feld 'custome_id' als Primärschlüssel anwenden? Beispielcode erklären.
Suresh Chikani
Können Sie bitte hinzufügen "Wie können wir den Typ der vorhandenen Spalte ändern?" in deiner frage?
Praful Rajput
3
@Keyur Shah, Sie müssen keine neue Datei M2 erstellen. Sie müssen den folgenden Code in UpgradeSchema.php einfügen und setup_version auch in module.xml aktualisieren. if (version_compare ($ context-> getVersion (), '1.0.0') <0) {// you code} if (version_compare ($ context-> getVersion (), '1.0.1') <0) {/ / dein Code}
Praful Rajput
2

Um das Installationsschema zu aktualisieren, müssen Sie 'UpgradeSchema.php' schreiben,

Beispiel für UpgradeSchema.php:

namespace <namespace>\<modulename>\Setup;

use Magento\Framework\Setup\ModuleContextInterface;
use Magento\Framework\Setup\SchemaSetupInterface;
use Magento\Framework\Setup\UpgradeSchemaInterface;

/**
* @codeCoverageIgnore
*/
class UpgradeSchema implements UpgradeSchemaInterface
{
    /**
 * {@inheritdoc}
 */
public function upgrade(SchemaSetupInterface $setup, ModuleContextInterface $context)
{
    $installer = $setup;

    $installer->startSetup();

    /*your code here*/

    $installer->endSetup();
}
}

Schritt 2: In Ihrem Modul finden Sie die Datei module.xml im Ordner etc in dieser Datei. Der Versionswert für setup_version (Beispiel: 1.0.1 bis 1.0.2) sollte höher sein als der aktuelle Versionswert.

Schritt 3: Führen Sie den Befehl php bin / magento setup: upgrade von der CLI aus

Sheshgiri Anvekar
quelle