Django:如何管理特定于数据库的代码?

时间:2013-09-25 14:14:34

标签: python django postgresql database-agnostic

我正在使用postgres unaccent功能进行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是否可用。

1 个答案:

答案 0 :(得分: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)