Вставка данных в несколько таблиц с помощью Sequelize - PullRequest
0 голосов
/ 04 апреля 2020

Я впервые использую Sequelize с MySQL и хотел бы понять, как вставить данные в две таблицы с зависимостью внешнего ключа. Допустим, у меня есть две таблицы - bookingDescription и bookingSummary. Существуют следующие сущности:

//bookingSummary
module.exports = (sequelize, DataTypes) => {
    return sequelize.define('bookingSummary', {
        headerId: { type: DataTypes.INTEGER, primaryKey: true, autoIncrement: true,},
        titleId: DataTypes.STRING,
        abNumber: DataTypes.INTEGER,
        userProfileId: DataTypes.INTEGER,
        theatreId: DataTypes.STRING,
        mFId: DataTypes.STRING,
        createdBy: { type: DataTypes.TEXT, allowNull: false },
        modifiedBy: { type: DataTypes.TEXT, allowNull: false },
        status: DataTypes.STRING
    }, {
        tableName: 'booking_summary',
        underscored: true
    })
}

//bookingDescription 
module.exports = (sequelize, DataTypes) => {
    return sequelize.define('bookingWeek', {
        lineId: { type: DataTypes.INTEGER, primaryKey: true, autoIncrement: true,},
        headerId: DataTypes.STRING,
        titleId: DataTypes.STRING,
        abNumber: DataTypes.INTEGER,
        theatreId: DataTypes.STRING,
        mFId: DataTypes.STRING,
        theatreName: DataTypes.STRING,
        city: DataTypes.STRING,
        state: DataTypes.STRING,
        playStartDate: DataTypes.DATE,
        playEndDate: DataTypes.DATE,
        preferredFormat: DataTypes.INTEGER,
        screensInDay: DataTypes.INTEGER,
        featureTypeFlag: DataTypes.TEXT,
        cofeatureName: DataTypes.STRING,
        exhbtrReqComment: DataTypes.STRING,
        createdBy: { type: DataTypes.TEXT, allowNull: false },
        modifiedBy: { type: DataTypes.TEXT, allowNull: false },
        status: DataTypes.STRING
    }, {
        tableName: 'booking_description',
        underscored: true
    })
}

Ссылки внешнего ключа в bookingSummary следующие:

FOREIGN KEY (headerId) ССЫЛКИ bookingSummary (headerId)

FOREIGN KEY ( titleId, abNumber, mFId)

ССЫЛКИ bookingSummary (abNumber)

У меня есть объект данных, который должен быть немедленно вставлен в таблицы. Есть идеи, как к этому подойти?

1 Ответ

0 голосов
/ 04 апреля 2020

Итак, я бы порекомендовал вам сначала узнать о SQL отношениях, независимо от Sequelize, и вашей текущей структуре проекта, потому что мне кажется, что вам все еще не хватает базового c понимания логики c, стоящей за этими ассоциации, где они должны быть использованы и как.

Обе ваши таблицы имеют повторяющиеся поля, что не имеет смысла. Посмотрите здесь, например: https://code.tutsplus.com/articles/sql-for-beginners-part-3-database-relationships--net-8561

Что касается вашего текущего кода, я немного поиграл с ним, и это то, что я сделал (будет работать, только если вы используя model.syn c (), поскольку столбец необходимо создать автоматически. Также используйте force: true, если у вас уже есть таблицы):

module.exports = (sequelize, DataTypes) => {
    const bookingHeader =  sequelize.define('bookingHeader', {
        id: { type: DataTypes.INTEGER, primaryKey: true, autoIncrement: true},        
        abNumber: DataTypes.INTEGER,
        userProfileId: DataTypes.INTEGER,
        theatreId: DataTypes.STRING,
        mFId: DataTypes.STRING,
        createdBy: { type: DataTypes.TEXT, allowNull: true },
        modifiedBy: { type: DataTypes.TEXT, allowNull: true },
        status: DataTypes.STRING
    }, {
        tableName: 'booking_header',
        // underscored: true
    })

    bookingHeader.associate = function (models) {


        bookingHeader.hasOne(models.bookingDescription);
    };

    return bookingHeader;
}

Описание бронирования:

module.exports = (sequelize, DataTypes) => {
    const bookingDescription = sequelize.define('bookingDescription', {
        id: { type: DataTypes.INTEGER, primaryKey: true, autoIncrement: true, },
        abNumber: DataTypes.INTEGER,
        theatreId: DataTypes.STRING,
        mFId: DataTypes.STRING,
        theatreName: DataTypes.STRING,
        city: DataTypes.STRING,
        state: DataTypes.STRING,
        playStartDate: DataTypes.DATE,
        playEndDate: DataTypes.DATE,
        preferredFormat: DataTypes.INTEGER,
        screensInDay: DataTypes.INTEGER,
        featureTypeFlag: DataTypes.TEXT,
        cofeatureName: DataTypes.STRING,
        exhbtrReqComment: DataTypes.STRING,
        createdBy: { type: DataTypes.TEXT, allowNull: false },
        modifiedBy: { type: DataTypes.TEXT, allowNull: false },
        status: DataTypes.STRING
    }, {
        tableName: 'booking_description',
        // underscored: true
    })

    bookingDescription.associate = function (models) {


        bookingDescription.belongsTo(models.bookingHeader);
    };

    return bookingDescription;
}

На вашем маршруте вы можете сделать что-то вроде этого:

  const {bookingHeader,bookingDescription} = models;

  app.post("/booking", async (req, res, next) => {
    try {     
      const header = await bookingHeader.create(req.body)
      const headerId = header.id      
      await bookingDescription.create({state:'active',createdBy:'somebody',modifiedBy:'somebody',bookingHeaderId:headerId})      
      res.json(header);
    } catch (error) {
      console.log(error)
      res.status(500)    
    }
  });

Обратите внимание, что я жестко закодировал некоторые поля для описания, только для целей примера. Кроме того, возможно, что есть и «лучший» способ сделать это с помощью Sequelize, но документы действительно плохие, поэтому с этим можно справиться.

...