Разобрать содержимое одного столбца и вставить результат в другой с помощью колбы и переносить колбу - PullRequest
0 голосов
/ 15 октября 2019

Мне нужно получить содержимое из одного столбца в моей БД, проанализировать его, добавить новый столбец и вставить результат первого шага в этот новый. После этого «исходный столбец» должен быть удален. Проблема в том, что я понятия не имею, как выполнить такую ​​операцию, и в то же время сохранить постоянную миграцию. Я имею в виду, что если кто-то строит базу данных, миграции должны проходить одна за другой, включая эту «странную».

Моей первой мыслью было редактирование файла миграции и выполнение сценария между созданием нового столбца и удалением старого. , поэтому новый столбец будет заполнен, прежде чем я урону старый.


def upgrade():
    # ### commands auto generated by Alembic - please adjust! ###
    op.add_column('requests', sa.Column('payload', sa.Text(), nullable=True))
    move_requests_to_payload() # ???
    op.drop_column('requests', 'get_url')
    op.drop_column('requests', 'portal')
    # ### end Alembic commands ###

Что-то вроде этого выше. Ребята, у вас есть идеи, как это сделать?

1 Ответ

1 голос
/ 15 октября 2019

Хорошо, возможно, кто-то воспользуется этим ответом.

  1. Во-первых, я удалил поле, которое должно быть удалено в конце, из класса моей модели, добавил новый столбец и сгенерировал файл миграции.
  2. Поскольку в этот момент класс модели не знал об этом поле, я был вынужден использовать необработанный SQL для извлечения данных из БД.
def upgrade():
    # ### commands auto generated by Alembic - please adjust! ###
    conn = op.get_bind() 
    session = orm.Session(bind=conn) # it will be used later to update my db
    res = conn.execute('select id, get_url, collection_identifier from requests')
    results = res.fetchall() # this one fetch data from db
    get_urls = [{'id':r[0],'get':r[1]} for r in results] # this one parse response to list of dicitonaries

Когда я получил эти данные, я создал новый столбец методом op.add_column(), и в этот момент я смог использовать sqlalchemy ORM.

Последняя часть решенияСовершенно очевидно, потому что я просто запросил БД для объектов и обновил их, используя данные из 2.

После обновления таблицы я удалил старый столбец.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...