Mam obecnie kolumnę zawierającą znaczniki HTML. Wewnątrz tego znacznika znajduje się znacznik czasu, który chcę zapisać w nowej kolumnie (aby móc zapytać o to). Mój pomysł był aby wykonać następujące czynności w jednym migracji:Używanie ORM SQLAlchemy wewnątrz migracji Alembic: jak to zrobić?
- Utwórz nowy, zerowalne kolumny dla danych
- używać ORM w celu wyciągnięcia HTML muszę przeanalizować
- Dla każdego wiersza
- parsowania HTML wyciągnąć znacznik czasu
- zaktualizować obiekt ORM
Ale kiedy próbuję uruchomić moją migrację, wydaje się, że utknęła w nieskończonej pętli. Oto co mam do tej pory:
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')
Skąd wiesz, że utknął w nieskończonej pętli? –
Jeśli 'Tip.query' nie używa tej samej sesji co' op', to będą 2 transakcje, przy czym 'SELECT' utknął czekając na' ALTER TABLE', aby zatwierdzić. W każdym razie myślę, że jest czystsze, aby przenieść część ORM do jej własnego skryptu, aby uruchomić ją ręcznie po "aktualizacji alemicznej". – sayap
@ X-Istence Nie wiem, że utknęła w nieskończonej pętli. I ** DO ** wiem, że polecenie nigdy nie wraca. –