我试图通过数据库访问预先创建的MySQL View。 peewee将其视为一个表[peewee.model],但我仍然提示操作错误1054未知列。
PeeWee是否支持与数据库视图的交互?
答案 0 :(得分:4)
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)
好的 - 没有什么令人兴奋的,只是将三个名字加载到一张桌子里。然后我创建了一个与名称的大写转换相对应的视图:
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()]
然后我遇到了第一期。
当我继承了#34; Foo"时,我带了一个名为" id"的主键列。由于我使用了裸select()
(FooView.select()
),因此peewee假设我同时使用了{" id"和#34;名称"。由于视图没有" 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']
希望有所帮助。