Ich habe derzeit eine Spalte, die HTML-Markup enthält. Innerhalb dieses Markups gibt es einen Zeitstempel, den ich in einer neuen Spalte speichern möchte (so kann ich dagegen abfragen). Meine Idee war, die folgenden in einer einzigen Migration zu tun:Verwenden des SQLAlchemy ORM in einer Alembic-Migration: Wie kann ich?
- Erstellen Sie eine neue Spalte von -zulässige für die Daten
- Verwenden Sie die ORM die HTML-I
- Für jede Zeile
-
analysieren müssen zurück ziehen
- analysieren den HTML-Code den Zeitstempel ziehen
- Update das ORM-Objekt
Aber wenn ich versuche, meine Migration auszuführen, scheint es in einer Endlosschleife stecken zu bleiben. Hier ist, was ich bisher habe:
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')
Woher wissen Sie, dass es in einer Endlosschleife steckt? –
Wenn 'Tip.query' nicht die selbe Sitzung wie 'op' verwendet, dann wird es 2 Transaktionen geben, wobei die' SELECT'-Datei wartet, bis die' ALTER TABLE'-Anweisung ausgeführt wird. Wie auch immer, ich denke, es ist sauberer, den ORM-Teil in sein eigenes Skript zu verschieben, um nach dem "Alembic-Upgrade" manuell ausgeführt zu werden. – sayap
@ X-Istence Ich weiß nicht, dass es in einer Endlosschleife steckt. Ich weiß, dass der Befehl nie zurückkehrt. –