Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Database migration issues (unnecessary queries generated) [Summary Issue] #333

Closed
michaelbromley opened this issue May 8, 2020 · 9 comments

Comments

@michaelbromley
Copy link
Member

michaelbromley commented May 8, 2020

Problem

Vendure uses TypeORM to manage database access, schema creation and schema migration.

Overall TypeORM is great but currently the biggest pain point is migrations - there are numerous issues which cause TypeORM to generate unnecessary queries when generating migrations. Here is a collection of such issues currently open on the TypeORM repo:

Broadly, most of the issues fall into the following categories:

  1. Foreign keys & indexes getting needlessly dropped & created on each migration
  2. Column defaults getting needlessly re-defined on each migration

Cause

In the file RdbmsSchemaBuilder.ts the algorithm for building a schema is given as:

/**
 * Creates complete tables schemas in the database based on the entity metadatas.
 *
 * Steps how schema is being built:
 * 1. load list of all tables with complete column and keys information from the db
 * 2. drop all (old) foreign keys that exist in the table, but does not exist in the metadata
 * 3. create new tables that does not exist in the db, but exist in the metadata
 * 4. drop all columns exist (left old) in the db table, but does not exist in the metadata
 * 5. add columns from metadata which does not exist in the table
 * 6. update all exist columns which metadata has changed
 * 7. update primary keys - update old and create new primary key from changed columns
 * 8. create foreign keys which does not exist in the table yet
 * 9. create indices which are missing in db yet, and drops indices which exist in the db, but does not exist in the metadata anymore
 */

The root cause is that the logic for establishing the equality of foreign keys, indices and columns is faulty in some cases.

Each DB type has a corresponding QueryRunner implementation, e.g. MysqlQueryRunner, PostgresQueryRunner. Each QueryRunner implements a loadTables() method, which returns a Table object containing metadata on columns, indices, foreign keys etc.

This Table object is then used in the RdbmsSchemaBuilder.executeSchemaSyncOperationsInProperOrder() method:

    /**
     * Executes schema sync operations in a proper order.
     * Order of operations matter here.
     */
    protected async executeSchemaSyncOperationsInProperOrder(): Promise<void> {
        await this.dropOldViews();
        await this.dropOldForeignKeys();
        await this.dropOldIndices();
        await this.dropOldChecks();
        await this.dropOldExclusions();
        await this.dropCompositeUniqueConstraints();
        // await this.renameTables();
        await this.renameColumns();
        await this.createNewTables();
        await this.dropRemovedColumns();
        await this.addNewColumns();
        await this.updatePrimaryKeys();
        await this.updateExistColumns();
        await this.createNewIndices();
        await this.createNewChecks();
        await this.createNewExclusions();
        await this.createCompositeUniqueConstraints();
        await this.createForeignKeys();
        await this.createViews();
    }

If we take, for example, the dropOldForeignKeys() method, we then see this logic which compares foreign keys defined in the TypeORM decorators metadata vs those extracted from the DB tables:

// find foreign keys that exist in the schemas but does not exist in the entity metadata
const tableForeignKeysToDrop = table.foreignKeys.filter(tableForeignKey => {
  const metadataFK = metadata.foreignKeys.find(metadataForeignKey => foreignKeysMatch(tableForeignKey, metadataForeignKey));
  return !metadataFK
    || (metadataFK.onDelete && metadataFK.onDelete !== tableForeignKey.onDelete)
    || (metadataFK.onUpdate && metadataFK.onUpdate !== tableForeignKey.onUpdate);
 });

So for example, I found that a relation defined as

 @ManyToOne((type) => Asset, {onDelete: "SET NULL", nullable: true})

would lead to the "foreign key dropped & re-created on every migration" issue. Digging in, I traced it to the line which compares metadataFK.onDelete !== tableForeignKey.onDelete. The MysqlQueryRunner was returning the onDelete value as NO ACTION rather than SET NULL, causing TypeORM to think it is different and needs to be dropped.

The specific reasons for the error varies between each DB QueryRunner implementation, so it looks like each issue needs to be tested against each DB type as they will not all exist uniformly across DB types.

Solution

I've spent some time digging in to this and there seems to be no single fix for all of them - each one would require some investigation into the DB-specific QueryRunner.loadTables() implementation.

Unfortunately I am no SQL / DB expert and diving in to this now would take me away from more pressing Vendure issues that need attention.

First step: tests

I propose that, as a first step, a series of tests be created for TypeORM which demonstrate the various migration issues. For example, here is a test which will fail due to the foreign key issue described above:

https://gist.github.com/michaelbromley/99eecfe6d7efbc2fbb37f7cbec7b84b2

Once there is a suite of tests which fail on these issues, then work can start on fixing them. I am hoping community members with deeper knowledge of the RDBMSs involved can step in and help on these.

@samundra
Copy link
Contributor

You have repetition of

I think only one was meant to be there.

@michaelbromley
Copy link
Member Author

Thanks, edited 👍

@ArsalImam
Copy link

Any update here?

@michaelbromley michaelbromley pinned this issue Aug 18, 2020
@michaelbromley
Copy link
Member Author

Baseline

I internally updated my development Vendure repo to use TypeORM 0.2.25 (most current version), started the server with synchronize: true, and then ran a migration.

In theory, the migration should be empty, so the results of that migration give an idea of the extent of the problem with each supported DB type. Here are the results:

MySQL (using MariaDB)
import { MigrationInterface, QueryRunner } from 'typeorm';

// Mysql, TypeORM 0.2.25
export class noop1598600900289 implements MigrationInterface {
    public async up(queryRunner: QueryRunner): Promise<any> {
        await queryRunner.query(
            'ALTER TABLE `country_translation` DROP FOREIGN KEY `FK_20958e5bdb4c996c18ca63d18e4`',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `country_translation` CHANGE `baseId` `baseId` int NULL',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `channel` DROP FOREIGN KEY `FK_afe9f917a1c82b9e9e69f7c6129`',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `channel` DROP FOREIGN KEY `FK_c9ca2f58d4517460435cbd8b4c9`',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `channel` CHANGE `defaultTaxZoneId` `defaultTaxZoneId` int NULL',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `channel` CHANGE `defaultShippingZoneId` `defaultShippingZoneId` int NULL',
            undefined,
        );
        await queryRunner.query('ALTER TABLE `user` CHANGE `deletedAt` `deletedAt` datetime NULL', undefined);
        await queryRunner.query('ALTER TABLE `user` CHANGE `lastLogin` `lastLogin` datetime NULL', undefined);
        await queryRunner.query(
            'ALTER TABLE `authentication_method` DROP FOREIGN KEY `FK_00cbe87bc0d4e36758d61bd31d6`',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `authentication_method` CHANGE `identifier` `identifier` varchar(255) NULL',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `authentication_method` CHANGE `passwordHash` `passwordHash` varchar(255) NULL',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `authentication_method` CHANGE `verificationToken` `verificationToken` varchar(255) NULL',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `authentication_method` CHANGE `passwordResetToken` `passwordResetToken` varchar(255) NULL',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `authentication_method` CHANGE `identifierChangeToken` `identifierChangeToken` varchar(255) NULL',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `authentication_method` CHANGE `pendingIdentifier` `pendingIdentifier` varchar(255) NULL',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `authentication_method` CHANGE `strategy` `strategy` varchar(255) NULL',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `authentication_method` CHANGE `externalIdentifier` `externalIdentifier` varchar(255) NULL',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `authentication_method` CHANGE `metadata` `metadata` text NULL',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `authentication_method` CHANGE `userId` `userId` int NULL',
            undefined,
        );
        await queryRunner.query('ALTER TABLE `asset` CHANGE `focalPoint` `focalPoint` text NULL', undefined);
        await queryRunner.query(
            'ALTER TABLE `collection_translation` DROP FOREIGN KEY `FK_e329f9036210d75caa1d8f2154a`',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `collection_translation` CHANGE `baseId` `baseId` int NULL',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `collection` DROP FOREIGN KEY `FK_7256fef1bb42f1b38156b7449f5`',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `collection` DROP FOREIGN KEY `FK_4257b61275144db89fa0f5dc059`',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `collection` CHANGE `featuredAssetId` `featuredAssetId` int NULL',
            undefined,
        );
        await queryRunner.query('ALTER TABLE `collection` CHANGE `parentId` `parentId` int NULL', undefined);
        await queryRunner.query(
            'ALTER TABLE `facet_translation` DROP FOREIGN KEY `FK_eaea53f44bf9e97790d38a3d68f`',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `facet_translation` CHANGE `baseId` `baseId` int NULL',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `facet_value_translation` DROP FOREIGN KEY `FK_3d6e45823b65de808a66cb1423b`',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `facet_value_translation` CHANGE `baseId` `baseId` int NULL',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `facet_value` DROP FOREIGN KEY `FK_d101dc2265a7341be3d94968c5b`',
            undefined,
        );
        await queryRunner.query('ALTER TABLE `facet_value` CHANGE `facetId` `facetId` int NULL', undefined);
        await queryRunner.query(
            'ALTER TABLE `product_translation` DROP FOREIGN KEY `FK_7dbc75cb4e8b002620c4dbfdac5`',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `product_translation` CHANGE `baseId` `baseId` int NULL',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `product` DROP FOREIGN KEY `FK_91a19e6613534949a4ce6e76ff8`',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `product` CHANGE `deletedAt` `deletedAt` datetime NULL',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `product` CHANGE `featuredAssetId` `featuredAssetId` int NULL',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `product_option_group_translation` DROP FOREIGN KEY `FK_93751abc1451972c02e033b766c`',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `product_option_group_translation` CHANGE `baseId` `baseId` int NULL',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `product_option_group` DROP FOREIGN KEY `FK_a6e91739227bf4d442f23c52c75`',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `product_option_group` CHANGE `productId` `productId` int NULL',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `product_option_translation` DROP FOREIGN KEY `FK_a79a443c1f7841f3851767faa6d`',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `product_option_translation` CHANGE `baseId` `baseId` int NULL',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `stock_movement` DROP FOREIGN KEY `FK_e65ba3882557cab4febb54809bb`',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `stock_movement` DROP FOREIGN KEY `FK_cbb0990e398bf7713aebdd38482`',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `stock_movement` CHANGE `productVariantId` `productVariantId` int NULL',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `stock_movement` CHANGE `orderItemId` `orderItemId` int NULL',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `product_variant_price` DROP FOREIGN KEY `FK_e6126cd268aea6e9b31d89af9ab`',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `product_variant_price` CHANGE `variantId` `variantId` int NULL',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `product_variant_translation` DROP FOREIGN KEY `FK_420f4d6fb75d38b9dca79bc43b4`',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `product_variant_translation` CHANGE `baseId` `baseId` int NULL',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `product_variant` DROP FOREIGN KEY `FK_6e420052844edf3a5506d863ce6`',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `product_variant` DROP FOREIGN KEY `FK_0e6f516053cf982b537836e21cf`',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `product_variant` DROP FOREIGN KEY `FK_e38dca0d82fd64c7cf8aac8b8ef`',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `product_variant` CHANGE `deletedAt` `deletedAt` datetime NULL',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `product_variant` CHANGE `productId` `productId` int NULL',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `product_variant` CHANGE `featuredAssetId` `featuredAssetId` int NULL',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `product_variant` CHANGE `taxCategoryId` `taxCategoryId` int NULL',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `administrator` DROP FOREIGN KEY `FK_1966e18ce6a39a82b19204704d7`',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `administrator` CHANGE `deletedAt` `deletedAt` datetime NULL',
            undefined,
        );
        await queryRunner.query('ALTER TABLE `administrator` CHANGE `userId` `userId` int NULL', undefined);
        await queryRunner.query(
            'ALTER TABLE `payment` DROP FOREIGN KEY `FK_d09d285fe1645cd2f0db811e293`',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `payment` CHANGE `errorMessage` `errorMessage` varchar(255) NULL',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `payment` CHANGE `transactionId` `transactionId` varchar(255) NULL',
            undefined,
        );
        await queryRunner.query('ALTER TABLE `payment` CHANGE `orderId` `orderId` int NULL', undefined);
        await queryRunner.query('ALTER TABLE `refund` CHANGE `reason` `reason` varchar(255) NULL', undefined);
        await queryRunner.query(
            'ALTER TABLE `refund` CHANGE `transactionId` `transactionId` varchar(255) NULL',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `order_item` DROP FOREIGN KEY `FK_eed51be48640c21e1c76d3e9fbe`',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `order_item` DROP FOREIGN KEY `FK_3e5161133689fba526377cbccd3`',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `order_item` DROP FOREIGN KEY `FK_69384323444206753f0cdeb64e0`',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `order_item` CHANGE `fulfillmentId` `fulfillmentId` int NULL',
            undefined,
        );
        await queryRunner.query('ALTER TABLE `order_item` CHANGE `refundId` `refundId` int NULL', undefined);
        await queryRunner.query('ALTER TABLE `order_item` CHANGE `lineId` `lineId` int NULL', undefined);
        await queryRunner.query(
            'ALTER TABLE `order_line` DROP FOREIGN KEY `FK_cbcd22193eda94668e84d33f185`',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `order_line` DROP FOREIGN KEY `FK_77be94ce9ec6504466179462275`',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `order_line` DROP FOREIGN KEY `FK_9f065453910ea77d4be8e92618f`',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `order_line` DROP FOREIGN KEY `FK_239cfca2a55b98b90b6bef2e44f`',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `order_line` CHANGE `productVariantId` `productVariantId` int NULL',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `order_line` CHANGE `taxCategoryId` `taxCategoryId` int NULL',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `order_line` CHANGE `featuredAssetId` `featuredAssetId` int NULL',
            undefined,
        );
        await queryRunner.query('ALTER TABLE `order_line` CHANGE `orderId` `orderId` int NULL', undefined);
        await queryRunner.query(
            'ALTER TABLE `promotion` CHANGE `deletedAt` `deletedAt` datetime NULL',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `promotion` CHANGE `startsAt` `startsAt` datetime NULL',
            undefined,
        );
        await queryRunner.query('ALTER TABLE `promotion` CHANGE `endsAt` `endsAt` datetime NULL', undefined);
        await queryRunner.query(
            'ALTER TABLE `promotion` CHANGE `couponCode` `couponCode` varchar(255) NULL',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `promotion` CHANGE `perCustomerUsageLimit` `perCustomerUsageLimit` int NULL',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `shipping_method` CHANGE `deletedAt` `deletedAt` datetime NULL',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `order` DROP FOREIGN KEY `FK_4af424d3e7b2c3cb26e075e20fc`',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `order` DROP FOREIGN KEY `FK_124456e637cca7a415897dce659`',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `order` CHANGE `orderPlacedAt` `orderPlacedAt` datetime NULL',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `order` CHANGE `shippingMethodId` `shippingMethodId` int NULL',
            undefined,
        );
        await queryRunner.query('ALTER TABLE `order` CHANGE `taxZoneId` `taxZoneId` int NULL', undefined);
        await queryRunner.query('ALTER TABLE `order` CHANGE `customerId` `customerId` int NULL', undefined);
        await queryRunner.query(
            'ALTER TABLE `customer` DROP FOREIGN KEY `FK_3f62b42ed23958b120c235f74df`',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `customer` CHANGE `deletedAt` `deletedAt` datetime NULL',
            undefined,
        );
        await queryRunner.query('ALTER TABLE `customer` CHANGE `title` `title` varchar(255) NULL', undefined);
        await queryRunner.query(
            'ALTER TABLE `customer` CHANGE `phoneNumber` `phoneNumber` varchar(255) NULL',
            undefined,
        );
        await queryRunner.query('ALTER TABLE `customer` CHANGE `userId` `userId` int NULL', undefined);
        await queryRunner.query(
            'ALTER TABLE `address` DROP FOREIGN KEY `FK_dc34d382b493ade1f70e834c4d3`',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `address` DROP FOREIGN KEY `FK_d87215343c3a3a67e6a0b7f3ea9`',
            undefined,
        );
        await queryRunner.query('ALTER TABLE `address` CHANGE `customerId` `customerId` int NULL', undefined);
        await queryRunner.query('ALTER TABLE `address` CHANGE `countryId` `countryId` int NULL', undefined);
        await queryRunner.query(
            'ALTER TABLE `session` DROP FOREIGN KEY `FK_7a75399a4f4ffa48ee02e98c059`',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `session` DROP FOREIGN KEY `FK_3d2f174ef04fb312fdebd0ddc53`',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `session` CHANGE `authenticationStrategy` `authenticationStrategy` varchar(255) NULL',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `session` CHANGE `activeOrderId` `activeOrderId` int NULL',
            undefined,
        );
        await queryRunner.query('ALTER TABLE `session` CHANGE `userId` `userId` int NULL', undefined);
        await queryRunner.query(
            'ALTER TABLE `tax_rate` DROP FOREIGN KEY `FK_7ee3306d7638aa85ca90d672198`',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `tax_rate` DROP FOREIGN KEY `FK_9872fc7de2f4e532fd3230d1915`',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `tax_rate` DROP FOREIGN KEY `FK_8b5ab52fc8887c1a769b9276caf`',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `tax_rate` CHANGE `categoryId` `categoryId` int NULL',
            undefined,
        );
        await queryRunner.query('ALTER TABLE `tax_rate` CHANGE `zoneId` `zoneId` int NULL', undefined);
        await queryRunner.query(
            'ALTER TABLE `tax_rate` CHANGE `customerGroupId` `customerGroupId` int NULL',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `history_entry` DROP FOREIGN KEY `FK_92f8c334ef06275f9586fd01832`',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `history_entry` DROP FOREIGN KEY `FK_43ac602f839847fdb91101f30ec`',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `history_entry` DROP FOREIGN KEY `FK_3a05127e67435b4d2332ded7c9e`',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `history_entry` CHANGE `administratorId` `administratorId` int NULL',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `history_entry` CHANGE `customerId` `customerId` int NULL',
            undefined,
        );
        await queryRunner.query('ALTER TABLE `history_entry` CHANGE `orderId` `orderId` int NULL', undefined);
        await queryRunner.query(
            'ALTER TABLE `search_index_item` CHANGE `productPreviewFocalPoint` `productPreviewFocalPoint` text NULL',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `search_index_item` CHANGE `productVariantPreviewFocalPoint` `productVariantPreviewFocalPoint` text NULL',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `search_index_item` CHANGE `productAssetId` `productAssetId` int NULL',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `search_index_item` CHANGE `productVariantAssetId` `productVariantAssetId` int NULL',
            undefined,
        );
        await queryRunner.query('ALTER TABLE `job_record` CHANGE `data` `data` text NULL', undefined);
        await queryRunner.query('ALTER TABLE `job_record` CHANGE `result` `result` text NULL', undefined);
        await queryRunner.query(
            'ALTER TABLE `job_record` CHANGE `error` `error` varchar(255) NULL',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `job_record` CHANGE `startedAt` `startedAt` datetime(6) NULL',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `job_record` CHANGE `settledAt` `settledAt` datetime(6) NULL',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `country_translation` ADD CONSTRAINT `FK_20958e5bdb4c996c18ca63d18e4` FOREIGN KEY (`baseId`) REFERENCES `country`(`id`) ON DELETE CASCADE ON UPDATE NO ACTION',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `channel` ADD CONSTRAINT `FK_afe9f917a1c82b9e9e69f7c6129` FOREIGN KEY (`defaultTaxZoneId`) REFERENCES `zone`(`id`) ON DELETE NO ACTION ON UPDATE NO ACTION',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `channel` ADD CONSTRAINT `FK_c9ca2f58d4517460435cbd8b4c9` FOREIGN KEY (`defaultShippingZoneId`) REFERENCES `zone`(`id`) ON DELETE NO ACTION ON UPDATE NO ACTION',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `authentication_method` ADD CONSTRAINT `FK_00cbe87bc0d4e36758d61bd31d6` FOREIGN KEY (`userId`) REFERENCES `user`(`id`) ON DELETE NO ACTION ON UPDATE NO ACTION',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `collection_translation` ADD CONSTRAINT `FK_e329f9036210d75caa1d8f2154a` FOREIGN KEY (`baseId`) REFERENCES `collection`(`id`) ON DELETE CASCADE ON UPDATE NO ACTION',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `collection` ADD CONSTRAINT `FK_7256fef1bb42f1b38156b7449f5` FOREIGN KEY (`featuredAssetId`) REFERENCES `asset`(`id`) ON DELETE SET NULL ON UPDATE NO ACTION',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `collection` ADD CONSTRAINT `FK_4257b61275144db89fa0f5dc059` FOREIGN KEY (`parentId`) REFERENCES `collection`(`id`) ON DELETE NO ACTION ON UPDATE NO ACTION',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `facet_translation` ADD CONSTRAINT `FK_eaea53f44bf9e97790d38a3d68f` FOREIGN KEY (`baseId`) REFERENCES `facet`(`id`) ON DELETE CASCADE ON UPDATE NO ACTION',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `facet_value_translation` ADD CONSTRAINT `FK_3d6e45823b65de808a66cb1423b` FOREIGN KEY (`baseId`) REFERENCES `facet_value`(`id`) ON DELETE CASCADE ON UPDATE NO ACTION',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `facet_value` ADD CONSTRAINT `FK_d101dc2265a7341be3d94968c5b` FOREIGN KEY (`facetId`) REFERENCES `facet`(`id`) ON DELETE CASCADE ON UPDATE NO ACTION',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `product_translation` ADD CONSTRAINT `FK_7dbc75cb4e8b002620c4dbfdac5` FOREIGN KEY (`baseId`) REFERENCES `product`(`id`) ON DELETE NO ACTION ON UPDATE NO ACTION',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `product` ADD CONSTRAINT `FK_91a19e6613534949a4ce6e76ff8` FOREIGN KEY (`featuredAssetId`) REFERENCES `asset`(`id`) ON DELETE SET NULL ON UPDATE NO ACTION',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `product_option_group_translation` ADD CONSTRAINT `FK_93751abc1451972c02e033b766c` FOREIGN KEY (`baseId`) REFERENCES `product_option_group`(`id`) ON DELETE NO ACTION ON UPDATE NO ACTION',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `product_option_group` ADD CONSTRAINT `FK_a6e91739227bf4d442f23c52c75` FOREIGN KEY (`productId`) REFERENCES `product`(`id`) ON DELETE NO ACTION ON UPDATE NO ACTION',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `product_option_translation` ADD CONSTRAINT `FK_a79a443c1f7841f3851767faa6d` FOREIGN KEY (`baseId`) REFERENCES `product_option`(`id`) ON DELETE NO ACTION ON UPDATE NO ACTION',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `stock_movement` ADD CONSTRAINT `FK_e65ba3882557cab4febb54809bb` FOREIGN KEY (`productVariantId`) REFERENCES `product_variant`(`id`) ON DELETE NO ACTION ON UPDATE NO ACTION',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `stock_movement` ADD CONSTRAINT `FK_cbb0990e398bf7713aebdd38482` FOREIGN KEY (`orderItemId`) REFERENCES `order_item`(`id`) ON DELETE NO ACTION ON UPDATE NO ACTION',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `product_variant_price` ADD CONSTRAINT `FK_e6126cd268aea6e9b31d89af9ab` FOREIGN KEY (`variantId`) REFERENCES `product_variant`(`id`) ON DELETE NO ACTION ON UPDATE NO ACTION',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `product_variant_translation` ADD CONSTRAINT `FK_420f4d6fb75d38b9dca79bc43b4` FOREIGN KEY (`baseId`) REFERENCES `product_variant`(`id`) ON DELETE NO ACTION ON UPDATE NO ACTION',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `product_variant` ADD CONSTRAINT `FK_0e6f516053cf982b537836e21cf` FOREIGN KEY (`featuredAssetId`) REFERENCES `asset`(`id`) ON DELETE SET NULL ON UPDATE NO ACTION',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `product_variant` ADD CONSTRAINT `FK_e38dca0d82fd64c7cf8aac8b8ef` FOREIGN KEY (`taxCategoryId`) REFERENCES `tax_category`(`id`) ON DELETE NO ACTION ON UPDATE NO ACTION',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `product_variant` ADD CONSTRAINT `FK_6e420052844edf3a5506d863ce6` FOREIGN KEY (`productId`) REFERENCES `product`(`id`) ON DELETE NO ACTION ON UPDATE NO ACTION',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `administrator` ADD CONSTRAINT `FK_1966e18ce6a39a82b19204704d7` FOREIGN KEY (`userId`) REFERENCES `user`(`id`) ON DELETE NO ACTION ON UPDATE NO ACTION',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `payment` ADD CONSTRAINT `FK_d09d285fe1645cd2f0db811e293` FOREIGN KEY (`orderId`) REFERENCES `order`(`id`) ON DELETE NO ACTION ON UPDATE NO ACTION',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `order_item` ADD CONSTRAINT `FK_69384323444206753f0cdeb64e0` FOREIGN KEY (`lineId`) REFERENCES `order_line`(`id`) ON DELETE CASCADE ON UPDATE NO ACTION',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `order_item` ADD CONSTRAINT `FK_eed51be48640c21e1c76d3e9fbe` FOREIGN KEY (`fulfillmentId`) REFERENCES `fulfillment`(`id`) ON DELETE NO ACTION ON UPDATE NO ACTION',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `order_item` ADD CONSTRAINT `FK_3e5161133689fba526377cbccd3` FOREIGN KEY (`refundId`) REFERENCES `refund`(`id`) ON DELETE NO ACTION ON UPDATE NO ACTION',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `order_line` ADD CONSTRAINT `FK_cbcd22193eda94668e84d33f185` FOREIGN KEY (`productVariantId`) REFERENCES `product_variant`(`id`) ON DELETE NO ACTION ON UPDATE NO ACTION',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `order_line` ADD CONSTRAINT `FK_77be94ce9ec6504466179462275` FOREIGN KEY (`taxCategoryId`) REFERENCES `tax_category`(`id`) ON DELETE NO ACTION ON UPDATE NO ACTION',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `order_line` ADD CONSTRAINT `FK_9f065453910ea77d4be8e92618f` FOREIGN KEY (`featuredAssetId`) REFERENCES `asset`(`id`) ON DELETE NO ACTION ON UPDATE NO ACTION',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `order_line` ADD CONSTRAINT `FK_239cfca2a55b98b90b6bef2e44f` FOREIGN KEY (`orderId`) REFERENCES `order`(`id`) ON DELETE CASCADE ON UPDATE NO ACTION',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `order` ADD CONSTRAINT `FK_124456e637cca7a415897dce659` FOREIGN KEY (`customerId`) REFERENCES `customer`(`id`) ON DELETE NO ACTION ON UPDATE NO ACTION',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `order` ADD CONSTRAINT `FK_4af424d3e7b2c3cb26e075e20fc` FOREIGN KEY (`shippingMethodId`) REFERENCES `shipping_method`(`id`) ON DELETE NO ACTION ON UPDATE NO ACTION',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `customer` ADD CONSTRAINT `FK_3f62b42ed23958b120c235f74df` FOREIGN KEY (`userId`) REFERENCES `user`(`id`) ON DELETE NO ACTION ON UPDATE NO ACTION',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `address` ADD CONSTRAINT `FK_dc34d382b493ade1f70e834c4d3` FOREIGN KEY (`customerId`) REFERENCES `customer`(`id`) ON DELETE NO ACTION ON UPDATE NO ACTION',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `address` ADD CONSTRAINT `FK_d87215343c3a3a67e6a0b7f3ea9` FOREIGN KEY (`countryId`) REFERENCES `country`(`id`) ON DELETE NO ACTION ON UPDATE NO ACTION',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `session` ADD CONSTRAINT `FK_7a75399a4f4ffa48ee02e98c059` FOREIGN KEY (`activeOrderId`) REFERENCES `order`(`id`) ON DELETE NO ACTION ON UPDATE NO ACTION',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `session` ADD CONSTRAINT `FK_3d2f174ef04fb312fdebd0ddc53` FOREIGN KEY (`userId`) REFERENCES `user`(`id`) ON DELETE NO ACTION ON UPDATE NO ACTION',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `tax_rate` ADD CONSTRAINT `FK_7ee3306d7638aa85ca90d672198` FOREIGN KEY (`categoryId`) REFERENCES `tax_category`(`id`) ON DELETE NO ACTION ON UPDATE NO ACTION',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `tax_rate` ADD CONSTRAINT `FK_9872fc7de2f4e532fd3230d1915` FOREIGN KEY (`zoneId`) REFERENCES `zone`(`id`) ON DELETE NO ACTION ON UPDATE NO ACTION',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `tax_rate` ADD CONSTRAINT `FK_8b5ab52fc8887c1a769b9276caf` FOREIGN KEY (`customerGroupId`) REFERENCES `customer_group`(`id`) ON DELETE NO ACTION ON UPDATE NO ACTION',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `history_entry` ADD CONSTRAINT `FK_92f8c334ef06275f9586fd01832` FOREIGN KEY (`administratorId`) REFERENCES `administrator`(`id`) ON DELETE NO ACTION ON UPDATE NO ACTION',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `history_entry` ADD CONSTRAINT `FK_43ac602f839847fdb91101f30ec` FOREIGN KEY (`customerId`) REFERENCES `customer`(`id`) ON DELETE NO ACTION ON UPDATE NO ACTION',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `history_entry` ADD CONSTRAINT `FK_3a05127e67435b4d2332ded7c9e` FOREIGN KEY (`orderId`) REFERENCES `order`(`id`) ON DELETE NO ACTION ON UPDATE NO ACTION',
            undefined,
        );
    }

    public async down(queryRunner: QueryRunner): Promise<any> {
        await queryRunner.query(
            'ALTER TABLE `history_entry` DROP FOREIGN KEY `FK_3a05127e67435b4d2332ded7c9e`',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `history_entry` DROP FOREIGN KEY `FK_43ac602f839847fdb91101f30ec`',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `history_entry` DROP FOREIGN KEY `FK_92f8c334ef06275f9586fd01832`',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `tax_rate` DROP FOREIGN KEY `FK_8b5ab52fc8887c1a769b9276caf`',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `tax_rate` DROP FOREIGN KEY `FK_9872fc7de2f4e532fd3230d1915`',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `tax_rate` DROP FOREIGN KEY `FK_7ee3306d7638aa85ca90d672198`',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `session` DROP FOREIGN KEY `FK_3d2f174ef04fb312fdebd0ddc53`',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `session` DROP FOREIGN KEY `FK_7a75399a4f4ffa48ee02e98c059`',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `address` DROP FOREIGN KEY `FK_d87215343c3a3a67e6a0b7f3ea9`',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `address` DROP FOREIGN KEY `FK_dc34d382b493ade1f70e834c4d3`',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `customer` DROP FOREIGN KEY `FK_3f62b42ed23958b120c235f74df`',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `order` DROP FOREIGN KEY `FK_4af424d3e7b2c3cb26e075e20fc`',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `order` DROP FOREIGN KEY `FK_124456e637cca7a415897dce659`',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `order_line` DROP FOREIGN KEY `FK_239cfca2a55b98b90b6bef2e44f`',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `order_line` DROP FOREIGN KEY `FK_9f065453910ea77d4be8e92618f`',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `order_line` DROP FOREIGN KEY `FK_77be94ce9ec6504466179462275`',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `order_line` DROP FOREIGN KEY `FK_cbcd22193eda94668e84d33f185`',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `order_item` DROP FOREIGN KEY `FK_3e5161133689fba526377cbccd3`',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `order_item` DROP FOREIGN KEY `FK_eed51be48640c21e1c76d3e9fbe`',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `order_item` DROP FOREIGN KEY `FK_69384323444206753f0cdeb64e0`',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `payment` DROP FOREIGN KEY `FK_d09d285fe1645cd2f0db811e293`',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `administrator` DROP FOREIGN KEY `FK_1966e18ce6a39a82b19204704d7`',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `product_variant` DROP FOREIGN KEY `FK_6e420052844edf3a5506d863ce6`',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `product_variant` DROP FOREIGN KEY `FK_e38dca0d82fd64c7cf8aac8b8ef`',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `product_variant` DROP FOREIGN KEY `FK_0e6f516053cf982b537836e21cf`',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `product_variant_translation` DROP FOREIGN KEY `FK_420f4d6fb75d38b9dca79bc43b4`',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `product_variant_price` DROP FOREIGN KEY `FK_e6126cd268aea6e9b31d89af9ab`',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `stock_movement` DROP FOREIGN KEY `FK_cbb0990e398bf7713aebdd38482`',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `stock_movement` DROP FOREIGN KEY `FK_e65ba3882557cab4febb54809bb`',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `product_option_translation` DROP FOREIGN KEY `FK_a79a443c1f7841f3851767faa6d`',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `product_option_group` DROP FOREIGN KEY `FK_a6e91739227bf4d442f23c52c75`',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `product_option_group_translation` DROP FOREIGN KEY `FK_93751abc1451972c02e033b766c`',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `product` DROP FOREIGN KEY `FK_91a19e6613534949a4ce6e76ff8`',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `product_translation` DROP FOREIGN KEY `FK_7dbc75cb4e8b002620c4dbfdac5`',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `facet_value` DROP FOREIGN KEY `FK_d101dc2265a7341be3d94968c5b`',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `facet_value_translation` DROP FOREIGN KEY `FK_3d6e45823b65de808a66cb1423b`',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `facet_translation` DROP FOREIGN KEY `FK_eaea53f44bf9e97790d38a3d68f`',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `collection` DROP FOREIGN KEY `FK_4257b61275144db89fa0f5dc059`',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `collection` DROP FOREIGN KEY `FK_7256fef1bb42f1b38156b7449f5`',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `collection_translation` DROP FOREIGN KEY `FK_e329f9036210d75caa1d8f2154a`',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `authentication_method` DROP FOREIGN KEY `FK_00cbe87bc0d4e36758d61bd31d6`',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `channel` DROP FOREIGN KEY `FK_c9ca2f58d4517460435cbd8b4c9`',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `channel` DROP FOREIGN KEY `FK_afe9f917a1c82b9e9e69f7c6129`',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `country_translation` DROP FOREIGN KEY `FK_20958e5bdb4c996c18ca63d18e4`',
            undefined,
        );
        await queryRunner.query(
            "ALTER TABLE `job_record` CHANGE `settledAt` `settledAt` datetime(6) NULL DEFAULT 'NULL'",
            undefined,
        );
        await queryRunner.query(
            "ALTER TABLE `job_record` CHANGE `startedAt` `startedAt` datetime(6) NULL DEFAULT 'NULL'",
            undefined,
        );
        await queryRunner.query(
            "ALTER TABLE `job_record` CHANGE `error` `error` varchar(255) NULL DEFAULT 'NULL'",
            undefined,
        );
        await queryRunner.query(
            "ALTER TABLE `job_record` CHANGE `result` `result` text NULL DEFAULT 'NULL'",
            undefined,
        );
        await queryRunner.query(
            "ALTER TABLE `job_record` CHANGE `data` `data` text NULL DEFAULT 'NULL'",
            undefined,
        );
        await queryRunner.query(
            "ALTER TABLE `search_index_item` CHANGE `productVariantAssetId` `productVariantAssetId` int NULL DEFAULT 'NULL'",
            undefined,
        );
        await queryRunner.query(
            "ALTER TABLE `search_index_item` CHANGE `productAssetId` `productAssetId` int NULL DEFAULT 'NULL'",
            undefined,
        );
        await queryRunner.query(
            "ALTER TABLE `search_index_item` CHANGE `productVariantPreviewFocalPoint` `productVariantPreviewFocalPoint` text NULL DEFAULT 'NULL'",
            undefined,
        );
        await queryRunner.query(
            "ALTER TABLE `search_index_item` CHANGE `productPreviewFocalPoint` `productPreviewFocalPoint` text NULL DEFAULT 'NULL'",
            undefined,
        );
        await queryRunner.query(
            "ALTER TABLE `history_entry` CHANGE `orderId` `orderId` int NULL DEFAULT 'NULL'",
            undefined,
        );
        await queryRunner.query(
            "ALTER TABLE `history_entry` CHANGE `customerId` `customerId` int NULL DEFAULT 'NULL'",
            undefined,
        );
        await queryRunner.query(
            "ALTER TABLE `history_entry` CHANGE `administratorId` `administratorId` int NULL DEFAULT 'NULL'",
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `history_entry` ADD CONSTRAINT `FK_3a05127e67435b4d2332ded7c9e` FOREIGN KEY (`orderId`, `orderId`, `orderId`, `orderId`, `orderId`, `orderId`, `orderId`, `orderId`) REFERENCES `order`(`id`,`id`,`id`,`id`,`id`,`id`,`id`,`id`) ON DELETE NO ACTION ON UPDATE NO ACTION',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `history_entry` ADD CONSTRAINT `FK_43ac602f839847fdb91101f30ec` FOREIGN KEY (`customerId`, `customerId`, `customerId`, `customerId`, `customerId`, `customerId`, `customerId`, `customerId`) REFERENCES `customer`(`id`,`id`,`id`,`id`,`id`,`id`,`id`,`id`) ON DELETE NO ACTION ON UPDATE NO ACTION',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `history_entry` ADD CONSTRAINT `FK_92f8c334ef06275f9586fd01832` FOREIGN KEY (`administratorId`, `administratorId`, `administratorId`, `administratorId`, `administratorId`, `administratorId`, `administratorId`, `administratorId`) REFERENCES `administrator`(`id`,`id`,`id`,`id`,`id`,`id`,`id`,`id`) ON DELETE NO ACTION ON UPDATE NO ACTION',
            undefined,
        );
        await queryRunner.query(
            "ALTER TABLE `tax_rate` CHANGE `customerGroupId` `customerGroupId` int NULL DEFAULT 'NULL'",
            undefined,
        );
        await queryRunner.query(
            "ALTER TABLE `tax_rate` CHANGE `zoneId` `zoneId` int NULL DEFAULT 'NULL'",
            undefined,
        );
        await queryRunner.query(
            "ALTER TABLE `tax_rate` CHANGE `categoryId` `categoryId` int NULL DEFAULT 'NULL'",
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `tax_rate` ADD CONSTRAINT `FK_8b5ab52fc8887c1a769b9276caf` FOREIGN KEY (`customerGroupId`, `customerGroupId`, `customerGroupId`, `customerGroupId`, `customerGroupId`, `customerGroupId`, `customerGroupId`, `customerGroupId`) REFERENCES `customer_group`(`id`,`id`,`id`,`id`,`id`,`id`,`id`,`id`) ON DELETE NO ACTION ON UPDATE NO ACTION',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `tax_rate` ADD CONSTRAINT `FK_9872fc7de2f4e532fd3230d1915` FOREIGN KEY (`zoneId`, `zoneId`, `zoneId`, `zoneId`, `zoneId`, `zoneId`, `zoneId`, `zoneId`) REFERENCES `zone`(`id`,`id`,`id`,`id`,`id`,`id`,`id`,`id`) ON DELETE NO ACTION ON UPDATE NO ACTION',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `tax_rate` ADD CONSTRAINT `FK_7ee3306d7638aa85ca90d672198` FOREIGN KEY (`categoryId`, `categoryId`, `categoryId`, `categoryId`, `categoryId`, `categoryId`, `categoryId`, `categoryId`) REFERENCES `tax_category`(`id`,`id`,`id`,`id`,`id`,`id`,`id`,`id`) ON DELETE NO ACTION ON UPDATE NO ACTION',
            undefined,
        );
        await queryRunner.query(
            "ALTER TABLE `session` CHANGE `userId` `userId` int NULL DEFAULT 'NULL'",
            undefined,
        );
        await queryRunner.query(
            "ALTER TABLE `session` CHANGE `activeOrderId` `activeOrderId` int NULL DEFAULT 'NULL'",
            undefined,
        );
        await queryRunner.query(
            "ALTER TABLE `session` CHANGE `authenticationStrategy` `authenticationStrategy` varchar(255) NULL DEFAULT 'NULL'",
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `session` ADD CONSTRAINT `FK_3d2f174ef04fb312fdebd0ddc53` FOREIGN KEY (`userId`, `userId`, `userId`, `userId`, `userId`, `userId`, `userId`, `userId`) REFERENCES `user`(`id`,`id`,`id`,`id`,`id`,`id`,`id`,`id`) ON DELETE NO ACTION ON UPDATE NO ACTION',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `session` ADD CONSTRAINT `FK_7a75399a4f4ffa48ee02e98c059` FOREIGN KEY (`activeOrderId`, `activeOrderId`, `activeOrderId`, `activeOrderId`, `activeOrderId`, `activeOrderId`, `activeOrderId`, `activeOrderId`) REFERENCES `order`(`id`,`id`,`id`,`id`,`id`,`id`,`id`,`id`) ON DELETE NO ACTION ON UPDATE NO ACTION',
            undefined,
        );
        await queryRunner.query(
            "ALTER TABLE `address` CHANGE `countryId` `countryId` int NULL DEFAULT 'NULL'",
            undefined,
        );
        await queryRunner.query(
            "ALTER TABLE `address` CHANGE `customerId` `customerId` int NULL DEFAULT 'NULL'",
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `address` ADD CONSTRAINT `FK_d87215343c3a3a67e6a0b7f3ea9` FOREIGN KEY (`countryId`, `countryId`, `countryId`, `countryId`, `countryId`, `countryId`, `countryId`, `countryId`) REFERENCES `country`(`id`,`id`,`id`,`id`,`id`,`id`,`id`,`id`) ON DELETE NO ACTION ON UPDATE NO ACTION',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `address` ADD CONSTRAINT `FK_dc34d382b493ade1f70e834c4d3` FOREIGN KEY (`customerId`, `customerId`, `customerId`, `customerId`, `customerId`, `customerId`, `customerId`, `customerId`) REFERENCES `customer`(`id`,`id`,`id`,`id`,`id`,`id`,`id`,`id`) ON DELETE NO ACTION ON UPDATE NO ACTION',
            undefined,
        );
        await queryRunner.query(
            "ALTER TABLE `customer` CHANGE `userId` `userId` int NULL DEFAULT 'NULL'",
            undefined,
        );
        await queryRunner.query(
            "ALTER TABLE `customer` CHANGE `phoneNumber` `phoneNumber` varchar(255) NULL DEFAULT 'NULL'",
            undefined,
        );
        await queryRunner.query(
            "ALTER TABLE `customer` CHANGE `title` `title` varchar(255) NULL DEFAULT 'NULL'",
            undefined,
        );
        await queryRunner.query(
            "ALTER TABLE `customer` CHANGE `deletedAt` `deletedAt` datetime NULL DEFAULT 'NULL'",
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `customer` ADD CONSTRAINT `FK_3f62b42ed23958b120c235f74df` FOREIGN KEY (`userId`, `userId`, `userId`, `userId`, `userId`, `userId`, `userId`, `userId`) REFERENCES `user`(`id`,`id`,`id`,`id`,`id`,`id`,`id`,`id`) ON DELETE NO ACTION ON UPDATE NO ACTION',
            undefined,
        );
        await queryRunner.query(
            "ALTER TABLE `order` CHANGE `customerId` `customerId` int NULL DEFAULT 'NULL'",
            undefined,
        );
        await queryRunner.query(
            "ALTER TABLE `order` CHANGE `taxZoneId` `taxZoneId` int NULL DEFAULT 'NULL'",
            undefined,
        );
        await queryRunner.query(
            "ALTER TABLE `order` CHANGE `shippingMethodId` `shippingMethodId` int NULL DEFAULT 'NULL'",
            undefined,
        );
        await queryRunner.query(
            "ALTER TABLE `order` CHANGE `orderPlacedAt` `orderPlacedAt` datetime NULL DEFAULT 'NULL'",
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `order` ADD CONSTRAINT `FK_124456e637cca7a415897dce659` FOREIGN KEY (`customerId`, `customerId`, `customerId`, `customerId`, `customerId`, `customerId`, `customerId`, `customerId`) REFERENCES `customer`(`id`,`id`,`id`,`id`,`id`,`id`,`id`,`id`) ON DELETE NO ACTION ON UPDATE NO ACTION',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `order` ADD CONSTRAINT `FK_4af424d3e7b2c3cb26e075e20fc` FOREIGN KEY (`shippingMethodId`, `shippingMethodId`, `shippingMethodId`, `shippingMethodId`, `shippingMethodId`, `shippingMethodId`, `shippingMethodId`, `shippingMethodId`) REFERENCES `shipping_method`(`id`,`id`,`id`,`id`,`id`,`id`,`id`,`id`) ON DELETE NO ACTION ON UPDATE NO ACTION',
            undefined,
        );
        await queryRunner.query(
            "ALTER TABLE `shipping_method` CHANGE `deletedAt` `deletedAt` datetime NULL DEFAULT 'NULL'",
            undefined,
        );
        await queryRunner.query(
            "ALTER TABLE `promotion` CHANGE `perCustomerUsageLimit` `perCustomerUsageLimit` int NULL DEFAULT 'NULL'",
            undefined,
        );
        await queryRunner.query(
            "ALTER TABLE `promotion` CHANGE `couponCode` `couponCode` varchar(255) NULL DEFAULT 'NULL'",
            undefined,
        );
        await queryRunner.query(
            "ALTER TABLE `promotion` CHANGE `endsAt` `endsAt` datetime NULL DEFAULT 'NULL'",
            undefined,
        );
        await queryRunner.query(
            "ALTER TABLE `promotion` CHANGE `startsAt` `startsAt` datetime NULL DEFAULT 'NULL'",
            undefined,
        );
        await queryRunner.query(
            "ALTER TABLE `promotion` CHANGE `deletedAt` `deletedAt` datetime NULL DEFAULT 'NULL'",
            undefined,
        );
        await queryRunner.query(
            "ALTER TABLE `order_line` CHANGE `orderId` `orderId` int NULL DEFAULT 'NULL'",
            undefined,
        );
        await queryRunner.query(
            "ALTER TABLE `order_line` CHANGE `featuredAssetId` `featuredAssetId` int NULL DEFAULT 'NULL'",
            undefined,
        );
        await queryRunner.query(
            "ALTER TABLE `order_line` CHANGE `taxCategoryId` `taxCategoryId` int NULL DEFAULT 'NULL'",
            undefined,
        );
        await queryRunner.query(
            "ALTER TABLE `order_line` CHANGE `productVariantId` `productVariantId` int NULL DEFAULT 'NULL'",
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `order_line` ADD CONSTRAINT `FK_239cfca2a55b98b90b6bef2e44f` FOREIGN KEY (`orderId`, `orderId`, `orderId`, `orderId`, `orderId`, `orderId`, `orderId`, `orderId`) REFERENCES `order`(`id`,`id`,`id`,`id`,`id`,`id`,`id`,`id`) ON DELETE CASCADE ON UPDATE NO ACTION',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `order_line` ADD CONSTRAINT `FK_9f065453910ea77d4be8e92618f` FOREIGN KEY (`featuredAssetId`, `featuredAssetId`, `featuredAssetId`, `featuredAssetId`, `featuredAssetId`, `featuredAssetId`, `featuredAssetId`, `featuredAssetId`) REFERENCES `asset`(`id`,`id`,`id`,`id`,`id`,`id`,`id`,`id`) ON DELETE NO ACTION ON UPDATE NO ACTION',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `order_line` ADD CONSTRAINT `FK_77be94ce9ec6504466179462275` FOREIGN KEY (`taxCategoryId`, `taxCategoryId`, `taxCategoryId`, `taxCategoryId`, `taxCategoryId`, `taxCategoryId`, `taxCategoryId`, `taxCategoryId`) REFERENCES `tax_category`(`id`,`id`,`id`,`id`,`id`,`id`,`id`,`id`) ON DELETE NO ACTION ON UPDATE NO ACTION',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `order_line` ADD CONSTRAINT `FK_cbcd22193eda94668e84d33f185` FOREIGN KEY (`productVariantId`, `productVariantId`, `productVariantId`, `productVariantId`, `productVariantId`, `productVariantId`, `productVariantId`, `productVariantId`) REFERENCES `product_variant`(`id`,`id`,`id`,`id`,`id`,`id`,`id`,`id`) ON DELETE NO ACTION ON UPDATE NO ACTION',
            undefined,
        );
        await queryRunner.query(
            "ALTER TABLE `order_item` CHANGE `lineId` `lineId` int NULL DEFAULT 'NULL'",
            undefined,
        );
        await queryRunner.query(
            "ALTER TABLE `order_item` CHANGE `refundId` `refundId` int NULL DEFAULT 'NULL'",
            undefined,
        );
        await queryRunner.query(
            "ALTER TABLE `order_item` CHANGE `fulfillmentId` `fulfillmentId` int NULL DEFAULT 'NULL'",
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `order_item` ADD CONSTRAINT `FK_69384323444206753f0cdeb64e0` FOREIGN KEY (`lineId`, `lineId`, `lineId`, `lineId`, `lineId`, `lineId`, `lineId`, `lineId`) REFERENCES `order_line`(`id`,`id`,`id`,`id`,`id`,`id`,`id`,`id`) ON DELETE CASCADE ON UPDATE NO ACTION',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `order_item` ADD CONSTRAINT `FK_3e5161133689fba526377cbccd3` FOREIGN KEY (`refundId`, `refundId`, `refundId`, `refundId`, `refundId`, `refundId`, `refundId`, `refundId`) REFERENCES `refund`(`id`,`id`,`id`,`id`,`id`,`id`,`id`,`id`) ON DELETE NO ACTION ON UPDATE NO ACTION',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `order_item` ADD CONSTRAINT `FK_eed51be48640c21e1c76d3e9fbe` FOREIGN KEY (`fulfillmentId`, `fulfillmentId`, `fulfillmentId`, `fulfillmentId`, `fulfillmentId`, `fulfillmentId`, `fulfillmentId`, `fulfillmentId`) REFERENCES `fulfillment`(`id`,`id`,`id`,`id`,`id`,`id`,`id`,`id`) ON DELETE NO ACTION ON UPDATE NO ACTION',
            undefined,
        );
        await queryRunner.query(
            "ALTER TABLE `refund` CHANGE `transactionId` `transactionId` varchar(255) NULL DEFAULT 'NULL'",
            undefined,
        );
        await queryRunner.query(
            "ALTER TABLE `refund` CHANGE `reason` `reason` varchar(255) NULL DEFAULT 'NULL'",
            undefined,
        );
        await queryRunner.query(
            "ALTER TABLE `payment` CHANGE `orderId` `orderId` int NULL DEFAULT 'NULL'",
            undefined,
        );
        await queryRunner.query(
            "ALTER TABLE `payment` CHANGE `transactionId` `transactionId` varchar(255) NULL DEFAULT 'NULL'",
            undefined,
        );
        await queryRunner.query(
            "ALTER TABLE `payment` CHANGE `errorMessage` `errorMessage` varchar(255) NULL DEFAULT 'NULL'",
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `payment` ADD CONSTRAINT `FK_d09d285fe1645cd2f0db811e293` FOREIGN KEY (`orderId`, `orderId`, `orderId`, `orderId`, `orderId`, `orderId`, `orderId`, `orderId`) REFERENCES `order`(`id`,`id`,`id`,`id`,`id`,`id`,`id`,`id`) ON DELETE NO ACTION ON UPDATE NO ACTION',
            undefined,
        );
        await queryRunner.query(
            "ALTER TABLE `administrator` CHANGE `userId` `userId` int NULL DEFAULT 'NULL'",
            undefined,
        );
        await queryRunner.query(
            "ALTER TABLE `administrator` CHANGE `deletedAt` `deletedAt` datetime NULL DEFAULT 'NULL'",
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `administrator` ADD CONSTRAINT `FK_1966e18ce6a39a82b19204704d7` FOREIGN KEY (`userId`, `userId`, `userId`, `userId`, `userId`, `userId`, `userId`, `userId`) REFERENCES `user`(`id`,`id`,`id`,`id`,`id`,`id`,`id`,`id`) ON DELETE NO ACTION ON UPDATE NO ACTION',
            undefined,
        );
        await queryRunner.query(
            "ALTER TABLE `product_variant` CHANGE `taxCategoryId` `taxCategoryId` int NULL DEFAULT 'NULL'",
            undefined,
        );
        await queryRunner.query(
            "ALTER TABLE `product_variant` CHANGE `featuredAssetId` `featuredAssetId` int NULL DEFAULT 'NULL'",
            undefined,
        );
        await queryRunner.query(
            "ALTER TABLE `product_variant` CHANGE `productId` `productId` int NULL DEFAULT 'NULL'",
            undefined,
        );
        await queryRunner.query(
            "ALTER TABLE `product_variant` CHANGE `deletedAt` `deletedAt` datetime NULL DEFAULT 'NULL'",
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `product_variant` ADD CONSTRAINT `FK_e38dca0d82fd64c7cf8aac8b8ef` FOREIGN KEY (`taxCategoryId`, `taxCategoryId`, `taxCategoryId`, `taxCategoryId`, `taxCategoryId`, `taxCategoryId`, `taxCategoryId`, `taxCategoryId`) REFERENCES `tax_category`(`id`,`id`,`id`,`id`,`id`,`id`,`id`,`id`) ON DELETE NO ACTION ON UPDATE NO ACTION',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `product_variant` ADD CONSTRAINT `FK_0e6f516053cf982b537836e21cf` FOREIGN KEY (`featuredAssetId`, `featuredAssetId`, `featuredAssetId`, `featuredAssetId`, `featuredAssetId`, `featuredAssetId`, `featuredAssetId`, `featuredAssetId`) REFERENCES `asset`(`id`,`id`,`id`,`id`,`id`,`id`,`id`,`id`) ON DELETE SET NULL ON UPDATE NO ACTION',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `product_variant` ADD CONSTRAINT `FK_6e420052844edf3a5506d863ce6` FOREIGN KEY (`productId`, `productId`, `productId`, `productId`, `productId`, `productId`, `productId`, `productId`) REFERENCES `product`(`id`,`id`,`id`,`id`,`id`,`id`,`id`,`id`) ON DELETE NO ACTION ON UPDATE NO ACTION',
            undefined,
        );
        await queryRunner.query(
            "ALTER TABLE `product_variant_translation` CHANGE `baseId` `baseId` int NULL DEFAULT 'NULL'",
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `product_variant_translation` ADD CONSTRAINT `FK_420f4d6fb75d38b9dca79bc43b4` FOREIGN KEY (`baseId`, `baseId`, `baseId`, `baseId`, `baseId`, `baseId`, `baseId`, `baseId`) REFERENCES `product_variant`(`id`,`id`,`id`,`id`,`id`,`id`,`id`,`id`) ON DELETE NO ACTION ON UPDATE NO ACTION',
            undefined,
        );
        await queryRunner.query(
            "ALTER TABLE `product_variant_price` CHANGE `variantId` `variantId` int NULL DEFAULT 'NULL'",
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `product_variant_price` ADD CONSTRAINT `FK_e6126cd268aea6e9b31d89af9ab` FOREIGN KEY (`variantId`, `variantId`, `variantId`, `variantId`, `variantId`, `variantId`, `variantId`, `variantId`) REFERENCES `product_variant`(`id`,`id`,`id`,`id`,`id`,`id`,`id`,`id`) ON DELETE NO ACTION ON UPDATE NO ACTION',
            undefined,
        );
        await queryRunner.query(
            "ALTER TABLE `stock_movement` CHANGE `orderItemId` `orderItemId` int NULL DEFAULT 'NULL'",
            undefined,
        );
        await queryRunner.query(
            "ALTER TABLE `stock_movement` CHANGE `productVariantId` `productVariantId` int NULL DEFAULT 'NULL'",
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `stock_movement` ADD CONSTRAINT `FK_cbb0990e398bf7713aebdd38482` FOREIGN KEY (`orderItemId`, `orderItemId`, `orderItemId`, `orderItemId`, `orderItemId`, `orderItemId`, `orderItemId`, `orderItemId`) REFERENCES `order_item`(`id`,`id`,`id`,`id`,`id`,`id`,`id`,`id`) ON DELETE NO ACTION ON UPDATE NO ACTION',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `stock_movement` ADD CONSTRAINT `FK_e65ba3882557cab4febb54809bb` FOREIGN KEY (`productVariantId`, `productVariantId`, `productVariantId`, `productVariantId`, `productVariantId`, `productVariantId`, `productVariantId`, `productVariantId`) REFERENCES `product_variant`(`id`,`id`,`id`,`id`,`id`,`id`,`id`,`id`) ON DELETE NO ACTION ON UPDATE NO ACTION',
            undefined,
        );
        await queryRunner.query(
            "ALTER TABLE `product_option_translation` CHANGE `baseId` `baseId` int NULL DEFAULT 'NULL'",
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `product_option_translation` ADD CONSTRAINT `FK_a79a443c1f7841f3851767faa6d` FOREIGN KEY (`baseId`, `baseId`, `baseId`, `baseId`, `baseId`, `baseId`, `baseId`, `baseId`) REFERENCES `product_option`(`id`,`id`,`id`,`id`,`id`,`id`,`id`,`id`) ON DELETE NO ACTION ON UPDATE NO ACTION',
            undefined,
        );
        await queryRunner.query(
            "ALTER TABLE `product_option_group` CHANGE `productId` `productId` int NULL DEFAULT 'NULL'",
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `product_option_group` ADD CONSTRAINT `FK_a6e91739227bf4d442f23c52c75` FOREIGN KEY (`productId`, `productId`, `productId`, `productId`, `productId`, `productId`, `productId`, `productId`) REFERENCES `product`(`id`,`id`,`id`,`id`,`id`,`id`,`id`,`id`) ON DELETE NO ACTION ON UPDATE NO ACTION',
            undefined,
        );
        await queryRunner.query(
            "ALTER TABLE `product_option_group_translation` CHANGE `baseId` `baseId` int NULL DEFAULT 'NULL'",
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `product_option_group_translation` ADD CONSTRAINT `FK_93751abc1451972c02e033b766c` FOREIGN KEY (`baseId`, `baseId`, `baseId`, `baseId`, `baseId`, `baseId`, `baseId`, `baseId`) REFERENCES `product_option_group`(`id`,`id`,`id`,`id`,`id`,`id`,`id`,`id`) ON DELETE NO ACTION ON UPDATE NO ACTION',
            undefined,
        );
        await queryRunner.query(
            "ALTER TABLE `product` CHANGE `featuredAssetId` `featuredAssetId` int NULL DEFAULT 'NULL'",
            undefined,
        );
        await queryRunner.query(
            "ALTER TABLE `product` CHANGE `deletedAt` `deletedAt` datetime NULL DEFAULT 'NULL'",
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `product` ADD CONSTRAINT `FK_91a19e6613534949a4ce6e76ff8` FOREIGN KEY (`featuredAssetId`, `featuredAssetId`, `featuredAssetId`, `featuredAssetId`, `featuredAssetId`, `featuredAssetId`, `featuredAssetId`, `featuredAssetId`, `featuredAssetId`) REFERENCES `asset`(`id`,`id`,`id`,`id`,`id`,`id`,`id`,`id`,`id`) ON DELETE SET NULL ON UPDATE NO ACTION',
            undefined,
        );
        await queryRunner.query(
            "ALTER TABLE `product_translation` CHANGE `baseId` `baseId` int NULL DEFAULT 'NULL'",
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `product_translation` ADD CONSTRAINT `FK_7dbc75cb4e8b002620c4dbfdac5` FOREIGN KEY (`baseId`, `baseId`, `baseId`, `baseId`, `baseId`, `baseId`, `baseId`, `baseId`) REFERENCES `product`(`id`,`id`,`id`,`id`,`id`,`id`,`id`,`id`) ON DELETE NO ACTION ON UPDATE NO ACTION',
            undefined,
        );
        await queryRunner.query(
            "ALTER TABLE `facet_value` CHANGE `facetId` `facetId` int NULL DEFAULT 'NULL'",
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `facet_value` ADD CONSTRAINT `FK_d101dc2265a7341be3d94968c5b` FOREIGN KEY (`facetId`, `facetId`, `facetId`, `facetId`, `facetId`, `facetId`, `facetId`, `facetId`) REFERENCES `facet`(`id`,`id`,`id`,`id`,`id`,`id`,`id`,`id`) ON DELETE CASCADE ON UPDATE NO ACTION',
            undefined,
        );
        await queryRunner.query(
            "ALTER TABLE `facet_value_translation` CHANGE `baseId` `baseId` int NULL DEFAULT 'NULL'",
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `facet_value_translation` ADD CONSTRAINT `FK_3d6e45823b65de808a66cb1423b` FOREIGN KEY (`baseId`, `baseId`, `baseId`, `baseId`, `baseId`, `baseId`, `baseId`, `baseId`) REFERENCES `facet_value`(`id`,`id`,`id`,`id`,`id`,`id`,`id`,`id`) ON DELETE CASCADE ON UPDATE NO ACTION',
            undefined,
        );
        await queryRunner.query(
            "ALTER TABLE `facet_translation` CHANGE `baseId` `baseId` int NULL DEFAULT 'NULL'",
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `facet_translation` ADD CONSTRAINT `FK_eaea53f44bf9e97790d38a3d68f` FOREIGN KEY (`baseId`, `baseId`, `baseId`, `baseId`, `baseId`, `baseId`, `baseId`, `baseId`) REFERENCES `facet`(`id`,`id`,`id`,`id`,`id`,`id`,`id`,`id`) ON DELETE CASCADE ON UPDATE NO ACTION',
            undefined,
        );
        await queryRunner.query(
            "ALTER TABLE `collection` CHANGE `parentId` `parentId` int NULL DEFAULT 'NULL'",
            undefined,
        );
        await queryRunner.query(
            "ALTER TABLE `collection` CHANGE `featuredAssetId` `featuredAssetId` int NULL DEFAULT 'NULL'",
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `collection` ADD CONSTRAINT `FK_4257b61275144db89fa0f5dc059` FOREIGN KEY (`parentId`, `parentId`, `parentId`, `parentId`, `parentId`, `parentId`, `parentId`, `parentId`) REFERENCES `collection`(`id`,`id`,`id`,`id`,`id`,`id`,`id`,`id`) ON DELETE NO ACTION ON UPDATE NO ACTION',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `collection` ADD CONSTRAINT `FK_7256fef1bb42f1b38156b7449f5` FOREIGN KEY (`featuredAssetId`, `featuredAssetId`, `featuredAssetId`, `featuredAssetId`, `featuredAssetId`, `featuredAssetId`, `featuredAssetId`, `featuredAssetId`) REFERENCES `asset`(`id`,`id`,`id`,`id`,`id`,`id`,`id`,`id`) ON DELETE SET NULL ON UPDATE NO ACTION',
            undefined,
        );
        await queryRunner.query(
            "ALTER TABLE `collection_translation` CHANGE `baseId` `baseId` int NULL DEFAULT 'NULL'",
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `collection_translation` ADD CONSTRAINT `FK_e329f9036210d75caa1d8f2154a` FOREIGN KEY (`baseId`, `baseId`, `baseId`, `baseId`, `baseId`, `baseId`, `baseId`, `baseId`) REFERENCES `collection`(`id`,`id`,`id`,`id`,`id`,`id`,`id`,`id`) ON DELETE CASCADE ON UPDATE NO ACTION',
            undefined,
        );
        await queryRunner.query(
            "ALTER TABLE `asset` CHANGE `focalPoint` `focalPoint` text NULL DEFAULT 'NULL'",
            undefined,
        );
        await queryRunner.query(
            "ALTER TABLE `authentication_method` CHANGE `userId` `userId` int NULL DEFAULT 'NULL'",
            undefined,
        );
        await queryRunner.query(
            "ALTER TABLE `authentication_method` CHANGE `metadata` `metadata` text NULL DEFAULT 'NULL'",
            undefined,
        );
        await queryRunner.query(
            "ALTER TABLE `authentication_method` CHANGE `externalIdentifier` `externalIdentifier` varchar(255) NULL DEFAULT 'NULL'",
            undefined,
        );
        await queryRunner.query(
            "ALTER TABLE `authentication_method` CHANGE `strategy` `strategy` varchar(255) NULL DEFAULT 'NULL'",
            undefined,
        );
        await queryRunner.query(
            "ALTER TABLE `authentication_method` CHANGE `pendingIdentifier` `pendingIdentifier` varchar(255) NULL DEFAULT 'NULL'",
            undefined,
        );
        await queryRunner.query(
            "ALTER TABLE `authentication_method` CHANGE `identifierChangeToken` `identifierChangeToken` varchar(255) NULL DEFAULT 'NULL'",
            undefined,
        );
        await queryRunner.query(
            "ALTER TABLE `authentication_method` CHANGE `passwordResetToken` `passwordResetToken` varchar(255) NULL DEFAULT 'NULL'",
            undefined,
        );
        await queryRunner.query(
            "ALTER TABLE `authentication_method` CHANGE `verificationToken` `verificationToken` varchar(255) NULL DEFAULT 'NULL'",
            undefined,
        );
        await queryRunner.query(
            "ALTER TABLE `authentication_method` CHANGE `passwordHash` `passwordHash` varchar(255) NULL DEFAULT 'NULL'",
            undefined,
        );
        await queryRunner.query(
            "ALTER TABLE `authentication_method` CHANGE `identifier` `identifier` varchar(255) NULL DEFAULT 'NULL'",
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `authentication_method` ADD CONSTRAINT `FK_00cbe87bc0d4e36758d61bd31d6` FOREIGN KEY (`userId`, `userId`, `userId`, `userId`, `userId`, `userId`, `userId`) REFERENCES `user`(`id`,`id`,`id`,`id`,`id`,`id`,`id`) ON DELETE NO ACTION ON UPDATE NO ACTION',
            undefined,
        );
        await queryRunner.query(
            "ALTER TABLE `user` CHANGE `lastLogin` `lastLogin` datetime NULL DEFAULT 'NULL'",
            undefined,
        );
        await queryRunner.query(
            "ALTER TABLE `user` CHANGE `deletedAt` `deletedAt` datetime NULL DEFAULT 'NULL'",
            undefined,
        );
        await queryRunner.query(
            "ALTER TABLE `channel` CHANGE `defaultShippingZoneId` `defaultShippingZoneId` int NULL DEFAULT 'NULL'",
            undefined,
        );
        await queryRunner.query(
            "ALTER TABLE `channel` CHANGE `defaultTaxZoneId` `defaultTaxZoneId` int NULL DEFAULT 'NULL'",
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `channel` ADD CONSTRAINT `FK_c9ca2f58d4517460435cbd8b4c9` FOREIGN KEY (`defaultShippingZoneId`, `defaultShippingZoneId`, `defaultShippingZoneId`, `defaultShippingZoneId`, `defaultShippingZoneId`, `defaultShippingZoneId`, `defaultShippingZoneId`, `defaultShippingZoneId`) REFERENCES `zone`(`id`,`id`,`id`,`id`,`id`,`id`,`id`,`id`) ON DELETE NO ACTION ON UPDATE NO ACTION',
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `channel` ADD CONSTRAINT `FK_afe9f917a1c82b9e9e69f7c6129` FOREIGN KEY (`defaultTaxZoneId`, `defaultTaxZoneId`, `defaultTaxZoneId`, `defaultTaxZoneId`, `defaultTaxZoneId`, `defaultTaxZoneId`, `defaultTaxZoneId`, `defaultTaxZoneId`) REFERENCES `zone`(`id`,`id`,`id`,`id`,`id`,`id`,`id`,`id`) ON DELETE NO ACTION ON UPDATE NO ACTION',
            undefined,
        );
        await queryRunner.query(
            "ALTER TABLE `country_translation` CHANGE `baseId` `baseId` int NULL DEFAULT 'NULL'",
            undefined,
        );
        await queryRunner.query(
            'ALTER TABLE `country_translation` ADD CONSTRAINT `FK_20958e5bdb4c996c18ca63d18e4` FOREIGN KEY (`baseId`, `baseId`, `baseId`, `baseId`, `baseId`, `baseId`, `baseId`, `baseId`, `baseId`) REFERENCES `country`(`id`,`id`,`id`,`id`,`id`,`id`,`id`,`id`,`id`) ON DELETE CASCADE ON UPDATE NO ACTION',
            undefined,
        );
    }
}
Postgres
import { MigrationInterface, QueryRunner } from 'typeorm';

export class postgres1598601015234 implements MigrationInterface {
    public async up(queryRunner: QueryRunner): Promise<any> {
        await queryRunner.query(`DROP INDEX "IDX_6fb55742e13e8082954d0436dc"`, undefined);
        await queryRunner.query(`DROP INDEX "IDX_d8791f444a8bf23fe4c1bc020c"`, undefined);
        await queryRunner.query(`DROP INDEX "IDX_9a5a6a556f75c4ac7bfdd03410"`, undefined);
        await queryRunner.query(
            `CREATE INDEX "IDX_6fb55742e13e8082954d0436dc" ON "search_index_item" ("productName") `,
            undefined,
        );
        await queryRunner.query(
            `CREATE INDEX "IDX_d8791f444a8bf23fe4c1bc020c" ON "search_index_item" ("productVariantName") `,
            undefined,
        );
        await queryRunner.query(
            `CREATE INDEX "IDX_9a5a6a556f75c4ac7bfdd03410" ON "search_index_item" ("description") `,
            undefined,
        );
    }

    public async down(queryRunner: QueryRunner): Promise<any> {
        await queryRunner.query(`DROP INDEX "IDX_9a5a6a556f75c4ac7bfdd03410"`, undefined);
        await queryRunner.query(`DROP INDEX "IDX_d8791f444a8bf23fe4c1bc020c"`, undefined);
        await queryRunner.query(`DROP INDEX "IDX_6fb55742e13e8082954d0436dc"`, undefined);
        await queryRunner.query(
            `CREATE INDEX "IDX_9a5a6a556f75c4ac7bfdd03410" ON "search_index_item" ("description") `,
            undefined,
        );
        await queryRunner.query(
            `CREATE INDEX "IDX_d8791f444a8bf23fe4c1bc020c" ON "search_index_item" ("productVariantName") `,
            undefined,
        );
        await queryRunner.query(
            `CREATE INDEX "IDX_6fb55742e13e8082954d0436dc" ON "search_index_item" ("productName") `,
            undefined,
        );
    }
}
SQLite
import {MigrationInterface, QueryRunner} from "typeorm";

export class sqlite1598601222394 implements MigrationInterface {

   public async up(queryRunner: QueryRunner): Promise<any> {
        await queryRunner.query(`DROP INDEX "IDX_9a5a6a556f75c4ac7bfdd03410"`, undefined);
        await queryRunner.query(`DROP INDEX "IDX_d8791f444a8bf23fe4c1bc020c"`, undefined);
        await queryRunner.query(`DROP INDEX "IDX_6fb55742e13e8082954d0436dc"`, undefined);
        await queryRunner.query(`CREATE TABLE "temporary_order_item" ("createdAt" datetime NOT NULL DEFAULT (datetime('now')), "updatedAt" datetime NOT NULL DEFAULT (datetime('now')), "unitPrice" integer NOT NULL, "unitPriceIncludesTax" boolean NOT NULL, "taxRate" decimal(5,2) NOT NULL, "pendingAdjustments" text NOT NULL, "cancelled" boolean NOT NULL DEFAULT (0), "id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "fulfillmentId" integer, "refundId" integer, "lineId" integer, CONSTRAINT "FK_3e5161133689fba526377cbccd3" FOREIGN KEY ("refundId") REFERENCES "refund" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION, CONSTRAINT "FK_eed51be48640c21e1c76d3e9fbe" FOREIGN KEY ("fulfillmentId") REFERENCES "fulfillment" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION, CONSTRAINT "FK_69384323444206753f0cdeb64e0" FOREIGN KEY ("lineId") REFERENCES "order_line" ("id") ON DELETE CASCADE ON UPDATE NO ACTION)`, undefined);
        await queryRunner.query(`INSERT INTO "temporary_order_item"("createdAt", "updatedAt", "unitPrice", "unitPriceIncludesTax", "taxRate", "pendingAdjustments", "cancelled", "id", "fulfillmentId", "refundId", "lineId") SELECT "createdAt", "updatedAt", "unitPrice", "unitPriceIncludesTax", "taxRate", "pendingAdjustments", "cancelled", "id", "fulfillmentId", "refundId", "lineId" FROM "order_item"`, undefined);
        await queryRunner.query(`DROP TABLE "order_item"`, undefined);
        await queryRunner.query(`ALTER TABLE "temporary_order_item" RENAME TO "order_item"`, undefined);
        await queryRunner.query(`CREATE TABLE "temporary_tax_rate" ("createdAt" datetime NOT NULL DEFAULT (datetime('now')), "updatedAt" datetime NOT NULL DEFAULT (datetime('now')), "name" varchar NOT NULL, "enabled" boolean NOT NULL, "value" decimal(5,2) NOT NULL, "id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "categoryId" integer, "zoneId" integer, "customerGroupId" integer, CONSTRAINT "FK_8b5ab52fc8887c1a769b9276caf" FOREIGN KEY ("customerGroupId") REFERENCES "customer_group" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION, CONSTRAINT "FK_9872fc7de2f4e532fd3230d1915" FOREIGN KEY ("zoneId") REFERENCES "zone" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION, CONSTRAINT "FK_7ee3306d7638aa85ca90d672198" FOREIGN KEY ("categoryId") REFERENCES "tax_category" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION)`, undefined);
        await queryRunner.query(`INSERT INTO "temporary_tax_rate"("createdAt", "updatedAt", "name", "enabled", "value", "id", "categoryId", "zoneId", "customerGroupId") SELECT "createdAt", "updatedAt", "name", "enabled", "value", "id", "categoryId", "zoneId", "customerGroupId" FROM "tax_rate"`, undefined);
        await queryRunner.query(`DROP TABLE "tax_rate"`, undefined);
        await queryRunner.query(`ALTER TABLE "temporary_tax_rate" RENAME TO "tax_rate"`, undefined);
        await queryRunner.query(`CREATE TABLE "temporary_order_item" ("createdAt" datetime NOT NULL DEFAULT (datetime('now')), "updatedAt" datetime NOT NULL DEFAULT (datetime('now')), "unitPrice" integer NOT NULL, "unitPriceIncludesTax" boolean NOT NULL, "taxRate" decimal(5,2) NOT NULL, "pendingAdjustments" text NOT NULL, "cancelled" boolean NOT NULL DEFAULT (0), "id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "fulfillmentId" integer, "refundId" integer, "lineId" integer, CONSTRAINT "FK_3e5161133689fba526377cbccd3" FOREIGN KEY ("refundId") REFERENCES "refund" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION, CONSTRAINT "FK_eed51be48640c21e1c76d3e9fbe" FOREIGN KEY ("fulfillmentId") REFERENCES "fulfillment" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION, CONSTRAINT "FK_69384323444206753f0cdeb64e0" FOREIGN KEY ("lineId") REFERENCES "order_line" ("id") ON DELETE CASCADE ON UPDATE NO ACTION)`, undefined);
        await queryRunner.query(`INSERT INTO "temporary_order_item"("createdAt", "updatedAt", "unitPrice", "unitPriceIncludesTax", "taxRate", "pendingAdjustments", "cancelled", "id", "fulfillmentId", "refundId", "lineId") SELECT "createdAt", "updatedAt", "unitPrice", "unitPriceIncludesTax", "taxRate", "pendingAdjustments", "cancelled", "id", "fulfillmentId", "refundId", "lineId" FROM "order_item"`, undefined);
        await queryRunner.query(`DROP TABLE "order_item"`, undefined);
        await queryRunner.query(`ALTER TABLE "temporary_order_item" RENAME TO "order_item"`, undefined);
        await queryRunner.query(`CREATE TABLE "temporary_tax_rate" ("createdAt" datetime NOT NULL DEFAULT (datetime('now')), "updatedAt" datetime NOT NULL DEFAULT (datetime('now')), "name" varchar NOT NULL, "enabled" boolean NOT NULL, "value" decimal(5,2) NOT NULL, "id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "categoryId" integer, "zoneId" integer, "customerGroupId" integer, CONSTRAINT "FK_8b5ab52fc8887c1a769b9276caf" FOREIGN KEY ("customerGroupId") REFERENCES "customer_group" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION, CONSTRAINT "FK_9872fc7de2f4e532fd3230d1915" FOREIGN KEY ("zoneId") REFERENCES "zone" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION, CONSTRAINT "FK_7ee3306d7638aa85ca90d672198" FOREIGN KEY ("categoryId") REFERENCES "tax_category" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION)`, undefined);
        await queryRunner.query(`INSERT INTO "temporary_tax_rate"("createdAt", "updatedAt", "name", "enabled", "value", "id", "categoryId", "zoneId", "customerGroupId") SELECT "createdAt", "updatedAt", "name", "enabled", "value", "id", "categoryId", "zoneId", "customerGroupId" FROM "tax_rate"`, undefined);
        await queryRunner.query(`DROP TABLE "tax_rate"`, undefined);
        await queryRunner.query(`ALTER TABLE "temporary_tax_rate" RENAME TO "tax_rate"`, undefined);
        await queryRunner.query(`CREATE TABLE "temporary_job_record" ("createdAt" datetime NOT NULL DEFAULT (datetime('now')), "updatedAt" datetime NOT NULL DEFAULT (datetime('now')), "queueName" varchar NOT NULL, "data" text, "state" varchar NOT NULL, "progress" integer NOT NULL, "result" text, "error" varchar, "startedAt" datetime(6), "settledAt" datetime(6), "isSettled" boolean NOT NULL, "retries" integer NOT NULL, "attempts" integer NOT NULL, "id" integer PRIMARY KEY AUTOINCREMENT NOT NULL)`, undefined);
        await queryRunner.query(`INSERT INTO "temporary_job_record"("createdAt", "updatedAt", "queueName", "data", "state", "progress", "result", "error", "startedAt", "settledAt", "isSettled", "retries", "attempts", "id") SELECT "createdAt", "updatedAt", "queueName", "data", "state", "progress", "result", "error", "startedAt", "settledAt", "isSettled", "retries", "attempts", "id" FROM "job_record"`, undefined);
        await queryRunner.query(`DROP TABLE "job_record"`, undefined);
        await queryRunner.query(`ALTER TABLE "temporary_job_record" RENAME TO "job_record"`, undefined);
        await queryRunner.query(`CREATE INDEX "IDX_6fb55742e13e8082954d0436dc" ON "search_index_item" ("productName") `, undefined);
        await queryRunner.query(`CREATE INDEX "IDX_d8791f444a8bf23fe4c1bc020c" ON "search_index_item" ("productVariantName") `, undefined);
        await queryRunner.query(`CREATE INDEX "IDX_9a5a6a556f75c4ac7bfdd03410" ON "search_index_item" ("description") `, undefined);
   }

   public async down(queryRunner: QueryRunner): Promise<any> {
        await queryRunner.query(`DROP INDEX "IDX_9a5a6a556f75c4ac7bfdd03410"`, undefined);
        await queryRunner.query(`DROP INDEX "IDX_d8791f444a8bf23fe4c1bc020c"`, undefined);
        await queryRunner.query(`DROP INDEX "IDX_6fb55742e13e8082954d0436dc"`, undefined);
        await queryRunner.query(`ALTER TABLE "job_record" RENAME TO "temporary_job_record"`, undefined);
        await queryRunner.query(`CREATE TABLE "job_record" ("createdAt" datetime NOT NULL DEFAULT (datetime('now')), "updatedAt" datetime NOT NULL DEFAULT (datetime('now')), "queueName" varchar NOT NULL, "data" text, "state" varchar NOT NULL, "progress" integer NOT NULL, "result" text, "error" varchar, "startedAt" datetime(6), "settledAt" datetime(6), "isSettled" boolean NOT NULL, "retries" integer NOT NULL, "attempts" integer NOT NULL, "id" integer PRIMARY KEY AUTOINCREMENT NOT NULL)`, undefined);
        await queryRunner.query(`INSERT INTO "job_record"("createdAt", "updatedAt", "queueName", "data", "state", "progress", "result", "error", "startedAt", "settledAt", "isSettled", "retries", "attempts", "id") SELECT "createdAt", "updatedAt", "queueName", "data", "state", "progress", "result", "error", "startedAt", "settledAt", "isSettled", "retries", "attempts", "id" FROM "temporary_job_record"`, undefined);
        await queryRunner.query(`DROP TABLE "temporary_job_record"`, undefined);
        await queryRunner.query(`ALTER TABLE "tax_rate" RENAME TO "temporary_tax_rate"`, undefined);
        await queryRunner.query(`CREATE TABLE "tax_rate" ("createdAt" datetime NOT NULL DEFAULT (datetime('now')), "updatedAt" datetime NOT NULL DEFAULT (datetime('now')), "name" varchar NOT NULL, "enabled" boolean NOT NULL, "value" decimal(5,2) NOT NULL, "id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "categoryId" integer, "zoneId" integer, "customerGroupId" integer, CONSTRAINT "FK_8b5ab52fc8887c1a769b9276caf" FOREIGN KEY ("customerGroupId") REFERENCES "customer_group" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION, CONSTRAINT "FK_9872fc7de2f4e532fd3230d1915" FOREIGN KEY ("zoneId") REFERENCES "zone" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION, CONSTRAINT "FK_7ee3306d7638aa85ca90d672198" FOREIGN KEY ("categoryId") REFERENCES "tax_category" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION)`, undefined);
        await queryRunner.query(`INSERT INTO "tax_rate"("createdAt", "updatedAt", "name", "enabled", "value", "id", "categoryId", "zoneId", "customerGroupId") SELECT "createdAt", "updatedAt", "name", "enabled", "value", "id", "categoryId", "zoneId", "customerGroupId" FROM "temporary_tax_rate"`, undefined);
        await queryRunner.query(`DROP TABLE "temporary_tax_rate"`, undefined);
        await queryRunner.query(`ALTER TABLE "order_item" RENAME TO "temporary_order_item"`, undefined);
        await queryRunner.query(`CREATE TABLE "order_item" ("createdAt" datetime NOT NULL DEFAULT (datetime('now')), "updatedAt" datetime NOT NULL DEFAULT (datetime('now')), "unitPrice" integer NOT NULL, "unitPriceIncludesTax" boolean NOT NULL, "taxRate" decimal(5,2) NOT NULL, "pendingAdjustments" text NOT NULL, "cancelled" boolean NOT NULL DEFAULT (0), "id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "fulfillmentId" integer, "refundId" integer, "lineId" integer, CONSTRAINT "FK_3e5161133689fba526377cbccd3" FOREIGN KEY ("refundId") REFERENCES "refund" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION, CONSTRAINT "FK_eed51be48640c21e1c76d3e9fbe" FOREIGN KEY ("fulfillmentId") REFERENCES "fulfillment" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION, CONSTRAINT "FK_69384323444206753f0cdeb64e0" FOREIGN KEY ("lineId") REFERENCES "order_line" ("id") ON DELETE CASCADE ON UPDATE NO ACTION)`, undefined);
        await queryRunner.query(`INSERT INTO "order_item"("createdAt", "updatedAt", "unitPrice", "unitPriceIncludesTax", "taxRate", "pendingAdjustments", "cancelled", "id", "fulfillmentId", "refundId", "lineId") SELECT "createdAt", "updatedAt", "unitPrice", "unitPriceIncludesTax", "taxRate", "pendingAdjustments", "cancelled", "id", "fulfillmentId", "refundId", "lineId" FROM "temporary_order_item"`, undefined);
        await queryRunner.query(`DROP TABLE "temporary_order_item"`, undefined);
        await queryRunner.query(`ALTER TABLE "tax_rate" RENAME TO "temporary_tax_rate"`, undefined);
        await queryRunner.query(`CREATE TABLE "tax_rate" ("createdAt" datetime NOT NULL DEFAULT (datetime('now')), "updatedAt" datetime NOT NULL DEFAULT (datetime('now')), "name" varchar NOT NULL, "enabled" boolean NOT NULL, "value" decimal(5,2) NOT NULL, "id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "categoryId" integer, "zoneId" integer, "customerGroupId" integer, CONSTRAINT "FK_8b5ab52fc8887c1a769b9276caf" FOREIGN KEY ("customerGroupId") REFERENCES "customer_group" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION, CONSTRAINT "FK_9872fc7de2f4e532fd3230d1915" FOREIGN KEY ("zoneId") REFERENCES "zone" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION, CONSTRAINT "FK_7ee3306d7638aa85ca90d672198" FOREIGN KEY ("categoryId") REFERENCES "tax_category" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION)`, undefined);
        await queryRunner.query(`INSERT INTO "tax_rate"("createdAt", "updatedAt", "name", "enabled", "value", "id", "categoryId", "zoneId", "customerGroupId") SELECT "createdAt", "updatedAt", "name", "enabled", "value", "id", "categoryId", "zoneId", "customerGroupId" FROM "temporary_tax_rate"`, undefined);
        await queryRunner.query(`DROP TABLE "temporary_tax_rate"`, undefined);
        await queryRunner.query(`ALTER TABLE "order_item" RENAME TO "temporary_order_item"`, undefined);
        await queryRunner.query(`CREATE TABLE "order_item" ("createdAt" datetime NOT NULL DEFAULT (datetime('now')), "updatedAt" datetime NOT NULL DEFAULT (datetime('now')), "unitPrice" integer NOT NULL, "unitPriceIncludesTax" boolean NOT NULL, "taxRate" decimal(5,2) NOT NULL, "pendingAdjustments" text NOT NULL, "cancelled" boolean NOT NULL DEFAULT (0), "id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "fulfillmentId" integer, "refundId" integer, "lineId" integer, CONSTRAINT "FK_3e5161133689fba526377cbccd3" FOREIGN KEY ("refundId") REFERENCES "refund" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION, CONSTRAINT "FK_eed51be48640c21e1c76d3e9fbe" FOREIGN KEY ("fulfillmentId") REFERENCES "fulfillment" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION, CONSTRAINT "FK_69384323444206753f0cdeb64e0" FOREIGN KEY ("lineId") REFERENCES "order_line" ("id") ON DELETE CASCADE ON UPDATE NO ACTION)`, undefined);
        await queryRunner.query(`INSERT INTO "order_item"("createdAt", "updatedAt", "unitPrice", "unitPriceIncludesTax", "taxRate", "pendingAdjustments", "cancelled", "id", "fulfillmentId", "refundId", "lineId") SELECT "createdAt", "updatedAt", "unitPrice", "unitPriceIncludesTax", "taxRate", "pendingAdjustments", "cancelled", "id", "fulfillmentId", "refundId", "lineId" FROM "temporary_order_item"`, undefined);
        await queryRunner.query(`DROP TABLE "temporary_order_item"`, undefined);
        await queryRunner.query(`CREATE INDEX "IDX_6fb55742e13e8082954d0436dc" ON "search_index_item" ("productName") `, undefined);
        await queryRunner.query(`CREATE INDEX "IDX_d8791f444a8bf23fe4c1bc020c" ON "search_index_item" ("productVariantName") `, undefined);
        await queryRunner.query(`CREATE INDEX "IDX_9a5a6a556f75c4ac7bfdd03410" ON "search_index_item" ("description") `, undefined);
   }

}

MySQL is by far the worst here. Issues include:

  • Re-creating all relation ID columns, e.g. 'ALTER TABLE address CHANGE customerId customerId int NULL'
  • Dropping and re-creating all foreign keys
  • Re-creating nullable strings, e.g. 'ALTER TABLE authentication_method CHANGE strategy strategy varchar(255) NULL'
  • Re-creating nullable simple-json fields, e.g. 'ALTER TABLE job_record CHANGE data data text NULL'
  • Re-creating nullable datetime fields, e.g. ALTER TABLE job_record CHANGE settledAt settledAt datetime(6) NULL DEFAULT 'NULL'

Postgres seems to only suffer from one issue:

  • Re-creating indices on fields decorated with @Index({ fulltext: true }), e.g. CREATE INDEX "IDX_6fb55742e13e8082954d0436dc" ON "search_index_item" ("productName")

SQLite is doing something strange, creating temporary tables and copying existing data to them and then renaming. Perhaps this is a work-around for a limitation of SQLite.

@michaelbromley
Copy link
Member Author

Update: MySQL/MariaDB

Massive breakthrough!

I discovered that all the issues with the MySQL migration are caused by setting the driver to 'mysql' whilst using MariaDB. I was under the impression that MariaDB is a drop-in replacement, but there are veeery subtle differences which mean you need to set the driver to 'mariadb'. Once correctly configured, the migration results in an empty set up queries! Yipee! (also duh for me 😭)

@AleFons
Copy link

AleFons commented Aug 28, 2020

We've been using sqlite so that won't work for me.

@michaelbromley
Copy link
Member Author

Got 2 PRs in to TypeORM for a MariaDB issue (typeorm/typeorm#6632) and Postgres (typeorm/typeorm#6634)

@AleFons I'm going to look into sqlite next...

@michaelbromley
Copy link
Member Author

Here's the PR for the SQLite issue: typeorm/typeorm#6638

@michaelbromley michaelbromley unpinned this issue Aug 31, 2020
@michaelbromley
Copy link
Member Author

We can close this now, because all 3 of my PRs are now merged into TypeORM 🥳

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

4 participants