Ich habe folgendes Problem:sqlalchemy dynamische Abbildung
Ich habe die Klasse:
class Word(object):
def __init__(self):
self.id = None
self.columns = {}
def __str__(self):
return "(%s, %s)" % (str(self.id), str(self.columns))
self.columns ist ein dict welche halten wird (column: Column) -Werten. Der Name der Spalten werden zur Laufzeit bekannt, und sie sind in einer wordColumns Liste geladen, zum Beispiel
wordColumns = ['english', 'korean', 'romanian']
wordTable = Table('word', metadata,
Column('id', Integer, primary_key = True)
)
for columnName in wordColumns:
wordTable.append_column(Column(columnName, String(255), nullable = False))
Ich habe sogar eine explizite Mapper Eigenschaften zu „zwingen“ die Tabellenspalten auf Wort abgebildet werden. Spalten [columnName], anstelle von word.columnName, bekomme ich keinen Fehler beim Mapping, aber es scheint, dass das nicht funktioniert.
mapperProperties = {}
for column in wordColumns:
mapperProperties['columns[\'%']' % column] = wordTable.columns[column]
mapper(Word, wordTable, mapperProperties)
Wenn ich ein Wortobjekt laden, schafft SQLAlchemy ein Objekt, das die word.columns [ ‚Englisch‘], word.columns [Koreanischen '] usw. Eigenschaften, anstatt sie zu laden word.columns hat DIKT . Für jede Spalte wird eine neue Eigenschaft erstellt. Außerdem existiert das word.columns-Wörterbuch nicht einmal.
Auf die gleiche Weise erwartet SQLAlchemy, wenn ich versuche, ein Wort zu persistieren, die Spaltenwerte in Eigenschaften wie word.columns ['english'] (string type) anstelle des Wörterbuchs word.columns zu finden.
Ich muss sagen, dass meine Erfahrung mit Python und SQLAlchemy ziemlich begrenzt ist, vielleicht ist es nicht möglich zu tun, was ich versuche zu tun.
Jede Hilfe geschätzt,
Vielen Dank im Voraus.
Vielen Dank, dass Sie sich die Zeit genommen haben, eine solche vollständige Antwort zu schreiben. Ich stimme zu, dass die erste Lösung sauberer und eleganter ist als die zweite. Ich hatte keinen guten Grund, ein Diktat zu benutzen, außer der Tatsache, dass dies das "normale" Ding war, das mir in den Sinn kam. Wie ich schon sagte, ich bin ein wenig neu in Python und ich habe noch nicht gelernt, die Vorteile der dynamischen Sprachen zu nutzen. Ich werde deine erste Lösung verwenden. Nochmals vielen Dank :) –
Ich kann nicht darüber hinwegkommen, wie viele Beiträge wie diese hier existieren, aber ich bin immer noch beeindruckt, wenn ich einen sehe. Danke, dass du so viel darüber nachgedacht hast. Immer noch hilfreich, für neue Leute, über ein Jahr später. Mit freundlichen Grüßen – Profane
Nun, wenn ich Kwarts verwenden wollte, um Word zu initiieren, wie in w = Word (Englisch = 'Name', Koreanisch = 'Phoo', Rumänisch = 'Nume'), wie würde das funktionieren? In meinem Fall wird es weiterhin einen __init__ Fehler geben. Vielen Dank! – Julius