2016-08-01 4 views
0

私はデータベース経由で事前作成されたMySQLビューにアクセスしようとしています。 peeweeはそれをテーブルとして扱います[peewee.model]、しかし、私はまだOperational Error 1054 unknownカラムが表示されます。PeeWeeはMySQLビューとの対話をサポートしていますか?

PeeWeeはデータベースビューとのやりとりをサポートしていますか?

答えて

1

Peeweeは私が試したときにビューに対して照会することができましたが、簡単な概念実証を打ち込む間に私は2つの潜在的な問題に遭遇しました。

まず、コード:

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 - テーブルへのエキサイティングな何も、ちょうどロードされた3人の名前。その後、私は名前の大文字変換に対応するビューを作った:

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

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

を、私は最初の問題に遭遇:

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

私が失敗した以下を試みました。

"Foo"をサブクラス化したとき、私は "id"という名前のプライマリキー列を持ってきました。私は裸のselect()FooView.select())を使用していたので、peeweeは私が "id"と "name"の両方をwasntedと仮定しました。ビューには「id」がないため、エラーが発生しました。

私は名前だけを指定して、もう一度試してみました:

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

これも失敗しました。

この2番目のクエリが失敗した理由は、裸の上のカーソルの記述を見て、見つけることができます選択します。

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

SQLiteは、ビューの列の「UPPER(名前)」と命名。この問題を解決するために、私は、ビューを再定義:

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

さて、私はビューを照会すると、それだけで正常に動作します:

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

希望を助けています。

関連する問題