PeeWee是否支持与MySQL视图的交互?

时间:2016-08-01 20:13:01

标签: python views peewee

我试图通过数据库访问预先创建的MySQL View。 peewee将其视为一个表[peewee.model],但我仍然提示操作错误1054未知列。

PeeWee是否支持与数据库视图的交互?

1 个答案:

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

希望有所帮助。