2015-05-09 31 views
0

我遵循關於如何添加用戶定義的運算符的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' 

任何想法我可能是做錯了?

回答

1

的問題是,您要定義數據庫,您呼叫register_ops()之前。要解決直接的錯誤,您可以將db = MySQL...移動到register_ops()以下。

這似乎有點像在peewee,雖然是錯誤的,所以我開了一個GitHub的問題:https://github.com/coleifer/peewee/issues/599


編輯:我決定終究無法改變的行爲。我提出的解決方案應該可行 - 首先註冊ops,然後實例化第二個。實例數據庫時,也可以指定自定義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: '%'}) 
+0

非常感謝!這正是問題! –

+0

當試圖使用psql數組列類型時,我得到一個KeyError:'A @>'。我需要以某種方式爲它註冊嗎? –

+0

不,但請確保您的數據庫是'PostgresqlExtDatabase',而不是普通的舊'PostgresqlDatabase'。 – coleifer

0

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

之前,您需要定義這個

OP['MOD'] = 'mod' 
+0

哦,我忘了,包括在我的職位,但我已經定義OP [ 'MOD'] =' MOD」。編輯我的帖子。 –

相關問題