【问题标题】:Does PeeWee support interaction with MySQL Views?PeeWee 是否支持与 MySQL 视图交互?
【发布时间】:2016-08-01 20:13:01
【问题描述】:

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

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

【问题讨论】:

    标签: python views peewee


    【解决方案1】:

    我尝试过 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']
    

    希望对您有所帮助。

    【讨论】:

    • 优秀的答案及其推导。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2014-12-23
    • 1970-01-01
    • 2021-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多