Peewee 在尝试添加用户定义的运算符时抛出 KeyError
Peewee throws KeyError when trying to add user defined operator
我遵循了 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'
知道我做错了什么吗?
在此之前
def mod(lhs, rhs):
return Expression(lhs, OP.MOD, rhs)
你需要定义这个
OP['MOD'] = 'mod'
问题是您在调用 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: '%'})
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
导入到要在其中使用它的模块。
我遵循了 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'
知道我做错了什么吗?
在此之前
def mod(lhs, rhs):
return Expression(lhs, OP.MOD, rhs)
你需要定义这个
OP['MOD'] = 'mod'
问题是您在调用 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: '%'})
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
导入到要在其中使用它的模块。