2016-08-01 60 views

回答

1

Peewee在嘗試過時能夠查看視圖,但在輸入一個簡單的概念證明時,我遇到了兩個潛在的問題。

首先,代碼:

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 - 平平淡淡,只是裝了三個名字到一個表。然後我做了的名稱相對應的大寫轉換一個觀點:

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

我又試圖以下,其中失敗:

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

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

然後我跑進了第一個問題。

當我分類爲「Foo」時,我帶了一個名爲「id」的主鍵列。由於我使用了select()FooView.select()),因此,peewee認爲我同時擁有「id」和「name」。由於該視圖沒有「ID」,我得到了一個錯誤。

我又試了一次,僅指定名稱:

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

這也失敗了。

第二次查詢失敗原因可以通過裸選擇看光標描述中找到:

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'] 

希望有所幫助。