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)
希望有帮助。
| 归档时间: |
|
| 查看次数: |
1573 次 |
| 最近记录: |