2016-08-01 11 views
0

Ich versuche in der Datenbank über die vordefinierte MySQL View zuzugreifen. peewee behandelt es als Tabelle [peewee.model], aber ich werde immer noch mit Operational Error 1054 unknown column aufgefordert.Unterstützt PeeWee die Interaktion mit MySQL Views?

Unterstützt PeeWee Interaktionen mit der Datenbankansicht?

Antwort

1

Peewee war in der Lage, gegen Ansichten zu fragen, wenn ich es ausprobiert habe, aber während ich einen einfachen Proof-of-Concept eintippte, stieß ich auf zwei potentielle Fehler.

Zuerst wird der Code:

from peewee import * 

db = SqliteDatabase(':memory:') 

class Foo(Model): 
    name = TextField() 
    class Meta: database = db 

db.create_tables([Foo]) 
for name in ('huey', 'mickey', 'zaizee'): 
    Foo.create(name=name) 

OK - nichts Aufregendes, gerade geladen drei Namen in eine Tabelle. Dann machte ich eine Ansicht, die zur oberen Fall Umwandlung des Namens entspricht:

db.execute_sql('CREATE VIEW foo_view AS SELECT UPPER(name) FROM foo') 

Ich habe dann versucht, die folgende, die fehlgeschlagen:

class FooView(Foo): 
    class Meta: 
     db_table = 'foo_view' 

print [fv.name for fv in FooView.select()] 

Dann lief ich in der ersten Ausgabe.

Als ich "Foo" unterklassifizierte, brachte ich eine Primärschlüsselspalte namens "id" mit. Da ich einen blanken select() (FooView.select()) benutzte, nahm peewee an, dass ich sowohl die "ID" als auch den "Namen" brauchte. Da die Ansicht keine "ID" hat, habe ich einen Fehler erhalten.

Ich versuchte es noch einmal, nur Angabe des Namens:

print [fv.name for fv in FooView.select(FooView.name)] 

Dies schlug ebenfalls fehl.

curs = db.execute_sql('select * from foo_view') 
print curs.description[0][0] # Print the first column's name. 
# prints UPPER(name) 

SQLite benannt nach Ansicht der Spalte „UPPER (Name)“:

Der Grund dieser zweite Abfrage fehlschlägt kann, indem man die Cursor-Beschreibung auf einem kahlen wählen zu finden. Um dies zu beheben, neu definierte ich die Ansicht:

db.execute_sql('CREATE VIEW foo_view AS SELECT UPPER(name) AS name FROM foo') 

Nun, wenn ich die Ansicht Abfrage funktioniert es ganz gut:

print [x.name for x in FooView.select(FooView.name)] 
# prints ['HUEY', 'MICKEY', 'ZAIZEE'] 

Hoffnung, das hilft.