Ситуация Недавно я начал работать над новым проектом с использованием nodejs.У меня есть опыт использования Python / Django и C # /. NET (не большой поклонник последних).Node великолепен, но я должен сказать, что мне не хватает простоты построения моделей и автоматизации миграции в Django.В настоящее время я использую инфраструктуру AdonisJS, которая использует Knex.Knex - мощная библиотека, но все миграции необходимо создавать вручную.Кроме того, ORM AdonisJS, который управляет моделями, не зависит от Knex (менеджера миграции).Вы также не определяете атрибуты полей в Моделях, которые могут иметь преимущества для динамического выполнения действий в передней и задней части.Учитывая все вышесказанное, существует много места для человеческих ошибок, недопонимания и нагрузки на лодку, требующей большего набора текста.Я знаю, что горячая вещь в наши дни состоит в том, чтобы держать его свободно и быстро, но для этого конкретного проекта я ищу немного больше структуры, чем свободно определенные модели.
Текущее состояние ЧтоЯ приземлился на создание нового класса с именем tableModel и класса полей для определения полей в табличной модели.Я уже закончил это, и я успешно пишу файлы миграции, используя усы.Я также планирую автоматически писать Модели, с которыми у меня не должно быть проблем (скрестив пальцы).
Проблема Вот где это становится немного жестким, и где мне нужна помощь.Мне нужно отслеживать, что было добавлено или удалено с помощью миграции, чтобы я мог эффективно записывать взлеты и падения, так как модели таблиц меняются со временем.
Допустим, я добавил «tableModel», который создает миграцию для создания таблицы Foo с полями {id (bigint), user_id (int), name (string255)}
Позже я хочудобавить поле с именем description, чтобы я просто добавил его в «tableModel», а затем выполнил команду сборки, которая создаст миграцию.Как проверить, что уже было создано, хотя я делаю только up () для описания?
Затем я хочу удалить поле имени, чтобы выделить его в "tableModel" и запустить миграцию сборки.команда.Как проверить, что было перенесено, и что теперь нужно добавить в down (). Редактировать: я бы добавил поле удаления в верхнюю часть и соответствующий откат в нижнюю часть.
Бонусный раунд Допустим, я хочу изменить user_id из intдля bigint, потому что кто делает внешний ключ просто int?Как мне проверить не только то, что нужно добавить вверх и вниз, но и проверить, нужно ли мне изменить свойство в поле.
Редактировать: просто записать вверх.и соответствующий откат к понижению
Большой вопрос По сути, как определить грязные классы "tableModels"
Возможное решение? Я думаю, что, возможно, мне нужно записать какой-нибудь тип реестра или снимок, а затем выполнить сравнение при построении миграций и / или моделей, а затем выполнить повторный захват / снимок.Если это маршрут, я должен сохранить его в файле json, записать его в саму БД или есть другой / лучший вариант.
Если я создам экземпляры tableModel как константы, могу ли я на самом деле записать обратно вфайл JS и захватить снимок как атрибут?Если это вариант, подходит ли файловая система Node и как лучше это сделать?Узел продолжает удивлять меня, так что я не буду сбит с толку, если какой-либо из этих вариантов.
Справка! Если кто-то прошел этот путь раньше или знает о каких-либо инструментах, которые я мог бы использовать,Я был бы очень признателен и заранее благодарен.Кроме того, если я двигаюсь в совершенно неправильном направлении, то, пожалуйста, дайте мне знать, я и обрабатываю, и ценю все виды обратной связи.
Пример Что следует отметить, когда я определяю "tableModel "для данной миграции или модели, это экземпляр класса, я не создаю расширенный класс, так как это не моя форма.
class tableModel {
constructor(tableName, modelName = tableName, fields = []) {
this.tableName = tableName
this.modelName = modelName
this.fields = fields
}
// Bunch of other stuff
}
fooTableModel = new tableModel('fooTable', 'fooModel', fields = [
new tableField.stringField('title'),
new tableField.bigIntField('related_user_id'),
new tableField.textField('description','Testing Default',false,true)
]
)
, что соответствует:
tableModel {
tableName: 'fooTable',
modelName: 'fooModel',
fields:
[ stringField {
name: 'title',
type: 'string',
_unique: false,
allow_null: null,
fieldAttributes: {},
default_value: null },
bigIntField {
name: 'related_user_id',
type: 'bigInteger',
_unique: false,
allow_null: null,
fieldAttributes: {},
default_value: 0 },
textField {
name: 'description',
type: 'text',
_unique: false,
allow_null: true,
fieldAttributes: {},
default_value: 'Testing Default' } ]