1

我正在将 postgresunaccent功能用于 django 项目。

这使我的应用程序数据库特定,我希望能够使用其他一些数据库(没有扩展名的 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 但第二次查询失败并出现以下错误:

 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 回答