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 のバグに少し似ているようです


編集:結局、動作を変更しないことにしました。ただし、私が提案した解決策は機能するはずです-最初に操作を登録し、次にインスタンス化します。データベースをインスタンス化するときに、カスタム ops を指定することもできます。

http://docs.peewee-orm.com/en/latest/peewee/api.html#データベース

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 に答える