当我尝试的时候,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)
好吧没什么刺激的,只是把三个名字放进一个表里。然后我做了一个与名称的大写转换相对应的视图:
^{pr2}$
然后我尝试了以下方法,但失败了: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)]
这也失败了。在
第二个查询失败的原因可以通过查看裸select上的游标说明找到:curs = db.execute_sql('select * from foo_view')
print curs.description[0][0] # Print the first column's name.
# prints UPPER(name)
SQLite将视图的列命名为“UPPER(name)”。为了解决这个问题,我重新定义了视图: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']
希望有帮助。在