0

我遵循了 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'

有什么想法我可能做错了吗?

4

3 回答 3

1

问题是您在调用register_ops(). 要修复直接错误,您可以将db = MySQL...调用移至register_ops().

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


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

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: '%'})
于 2015-05-09T16:22:55.837 回答
0

在这之前

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

你需要定义这个

OP['MOD'] = 'mod'
于 2015-05-09T15:01:49.720 回答
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定义的函数导入到要使用它的模块中。

于 2020-09-08T03:29:33.860 回答