1

unaccentdjango プロジェクトに postgres 機能を使用しています。

これにより、アプリデータベースが固有になり、他のデータベース(拡張子のないpostgresなど)を使用できるようにしたいと考えています。この場合、もちろん、私は使用しませんunaccent

ユーザーにとって透過的なものにしたいと思います。私のコードは次のようになります。

def get_objects(text):
    try:
        qs = MyModel.objects.extra(
            where=[u"UPPER(unaccent("name")) LIKE UPPER(unaccent(%s))"],
            params = [u"%{0}%".format(text)]
        )
        return list(qs)
    except DatabaseError, msg:
        qs = MyModel.objects.filter(name__icontains=text)
        return list(qs)

残念ながら、unaccentがデータベースにインストールされていない場合、 DatabaseError が発生しますが、2 番目のクエリは次のエラーで失敗します。

 DatabaseError: current transaction is aborted, commands ignored until end of transaction block 

トランザクションのサポートを追加してロールバックしようとしましたが、成功しませんでした。

unaccentこのエラーを管理し、利用可能かどうかに関係なくコードを機能させる最善の方法は何ですか?

4

1 に答える 1

1

次のように値を確認できsettings.DATABASE_ENGINEます。

from django.conf import settings

def get_objects(text):
    if settings.DATABASE_ENGINE == 'postgresql_psycopg2':
        qs = MyModel.objects.extra(
            where=[u'UPPER(unaccent("name")) LIKE UPPER(unaccent(%s))'],
            params = [u"%{0}%".format(text)]
        )
        return list(qs)
    else:
        qs = MyModel.objects.filter(name__icontains=text)
        return list(qs)
于 2013-09-25T15:10:09.030 に答える