【发布时间】:2016-08-01 20:13:01
【问题描述】:
我正在尝试通过访问数据库中预先创建的 MySQL 视图。 peewee 将其视为表格 [peewee.model],但是仍然提示我操作错误 1054 未知列。
PeeWee 是否支持与数据库视图的交互?
【问题讨论】:
我正在尝试通过访问数据库中预先创建的 MySQL 视图。 peewee 将其视为表格 [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)
好的——没什么令人兴奋的,只是将三个名字加载到一个表中。然后我做了一个对应名字大写转换的视图:
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)]
这也失败了。
第二个查询失败的原因可以通过查看裸选择上的游标描述来找到:
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']
希望对您有所帮助。
【讨论】: