Attualmente ho una colonna che contiene markup HTML. Dentro quel markup, c'è un timestamp che voglio memorizzare in una nuova colonna (quindi posso interrogarlo contro di esso). La mia idea era quella di effettuare le seguenti operazioni in una singola migrazione:Utilizzo di SQLAlchemy ORM all'interno di una migrazione di Alembic: come faccio?
- Creare un nuovo, colonna Null per i dati
- l'ORM di tirare indietro il codice HTML che ho bisogno di analizzare
- Per ogni riga
- analizzare il HTML per estrarre il timestamp
- aggiornamento dell'oggetto ORM
Ma quando provo a eseguire la mia migrazione, sembra essere bloccato in un ciclo infinito. Ecco quello che ho finora:
def _extract_publication_date(html):
root = html5lib.parse(html, treebuilder='lxml', namespaceHTMLElements=False)
publication_date_string = root.xpath("//a/@data-datetime")[0]
return parse_date(publication_date)
def _update_tip(tip):
tip.publication_date = _extract_publication_date(tip.rendered_html)
tip.save()
def upgrade():
op.add_column('tip', sa.Column('publication_date', sa.DateTime(timezone=True)))
tips = Tip.query.all()
map(tips, _update_tip)
def downgrade():
op.drop_column('tip', 'publication_date')
Come fai a sapere che è bloccato in un ciclo infinito? –
Se 'Tip.query' non sta usando la stessa sessione di' op', allora ci saranno 2 transazioni, con 'SELECT' si è bloccato in attesa del commit 'ALTER TABLE'. Ad ogni modo, penso che sia più pulito spostare la porzione ORM sul proprio script, da eseguire manualmente dopo "aggiornamento alembic". – sayap
@ X-Istence Non so se è bloccato in un ciclo infinito. I ** DO ** so che il comando non ritorna mai. –