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

Does PeeWee support interaction with MySQL Views?

我正在尝试通过访问预先创建的 MySQL 数据库中的视图。 peewee 将其视为 table [peewee.model],但是我仍然收到操作错误 1054 未知列的提示。

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

当我尝试 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)

好的 - 没什么好兴奋的,只是将三个名字加载到 table 中。然后我做了一个对应名字大写转换的视图:

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

这也失败了。

第二个查询失败的原因可以通过查看游标描述找到 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']

希望对您有所帮助。