在尝试添加用户定义的运算符

时间:2015-05-09 14:23:44

标签: python orm flask peewee keyerror

我遵循了peewee文档中关于如何添加用户定义的运算符的简短指南,但是当我尝试这样做时,它给了我一个KeyError。

from peewee import *
from peewee import OP
from peewee import Expression

db = MySQLDatabase(app.config['MYSQL_DATABASE_DB'], host=app.config['MYSQL_DATABASE_HOST'], user=app.config['MYSQL_DATABASE_USER'], passwd=app.config['MYSQL_DATABASE_PASSWORD'])

OP['MOD'] = 'mod'

def mod(lhs, rhs):
    return Expression(lhs, OP.MOD, rhs)

MySQLDatabase.register_ops({OP.MOD: '%'})

class Base(Model):
    class Meta:
        database = db

class User(Base):
    user_id = PrimaryKeyField()
    first_name = CharField(max_length = 150)
    last_name = CharField(max_length = 150)

@app.route('/')
def test():
    query = User.select().where(mod(User.user_id, 2) == 0)
    return "Query: %r" % query

当我尝试运行它时,它给了我这个错误:

KeyError: 'mod'

任何想法我可能做错了什么?

3 个答案:

答案 0 :(得分:1)

问题是您在调用register_ops()之前定义了数据库。要解决此问题,您可以将db = MySQL...移至register_ops()

这看起来有点像peewee中的一个错误,所以我打开了一个github问题:https://github.com/coleifer/peewee/issues/599

编辑:我决定不改变行为。我提出的解决方案应该可以工作 - 首先注册ops,然后实例化第二个。您还可以在实例化数据库时指定自定义操作:

http://docs.peewee-orm.com/en/latest/peewee/api.html#Database

实施例

OP['MOD'] = 'mod'

def mod(lhs, rhs):
    return Expression(lhs, OP.MOD, rhs)

db = MySQLDatabase(
    app.config['MYSQL_DATABASE_DB'], 
    host=app.config['MYSQL_DATABASE_HOST'], 
    user=app.config['MYSQL_DATABASE_USER'], 
    passwd=app.config['MYSQL_DATABASE_PASSWORD'],
    ops={OP.MOD: '%'})

答案 1 :(得分:0)

在此之前

def mod(lhs, rhs):
    return Expression(lhs, OP.MOD, rhs)

您需要定义此

OP['MOD'] = 'mod'

答案 2 :(得分:0)

OP['MOD'] = 'mod'

def mod(lhs, rhs):
    return Expression(lhs, OP.MOD, rhs)

db = MySQLDatabase(
    app.config['MYSQL_DATABASE_DB'], 
    host=app.config['MYSQL_DATABASE_HOST'], 
    user=app.config['MYSQL_DATABASE_USER'], 
    passwd=app.config['MYSQL_DATABASE_PASSWORD'])

指定ops参数将导致错误,实际上,您不必这样做。

您唯一需要注意的是将您定义的函数mod导入到要在其中使用的模块。