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

Nav*_*jay 3 python views peewee

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

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

col*_*fer 10

当我尝试过 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)
Run Code Online (Sandbox Code Playgroud)

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

db.execute_sql('CREATE VIEW foo_view AS SELECT UPPER(name) FROM foo')
Run Code Online (Sandbox Code Playgroud)

然后我尝试了以下方法,但失败了:

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

print [fv.name for fv in FooView.select()]
Run Code Online (Sandbox Code Playgroud)

然后我遇到了第一个问题。

当我对“Foo”进行子类化时,我带来了一个名为“id”的主键列。由于我使用了一个裸select()( FooView.select()),peewee 假设我浪费了“id”和“name”。由于视图没有“id”,我得到了一个错误。

我再次尝试,仅指定名称:

print [fv.name for fv in FooView.select(FooView.name)]
Run Code Online (Sandbox Code Playgroud)

这也失败了。

通过查看裸选择上的游标描述可以找到第二个查询失败的原因:

curs = db.execute_sql('select * from foo_view')
print curs.description[0][0]  # Print the first column's name.
# prints UPPER(name)
Run Code Online (Sandbox Code Playgroud)

SQLite 将视图的列命名为“UPPER(name)”。为了解决这个问题,我重新定义了视图:

db.execute_sql('CREATE VIEW foo_view AS SELECT UPPER(name) AS name FROM foo')
Run Code Online (Sandbox Code Playgroud)

现在,当我查询视图时,它工作得很好:

print [x.name for x in FooView.select(FooView.name)]
# prints ['HUEY', 'MICKEY', 'ZAIZEE']
Run Code Online (Sandbox Code Playgroud)

希望有帮助。

  • 优秀的答案及其推导。谢谢你! (2认同)