【问题标题】:Django : How to manage database specific code?Django:如何管理数据库特定代码?
【发布时间】:2013-09-25 14:14:33
【问题描述】:

我正在将 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 是否可用,管理此错误并使代码正常工作的最佳方法是什么。

【问题讨论】:

  • 您有语法错误。 try 块中的 ) 应该在 return list(qs) 之前。现在,return qs 作为 SQL 语句的一部分被发送到 extra(),但它失败了。
  • 谢谢,我认为它已修复。这不是真正的代码......只是试图解释我想要做什么

标签: python django postgresql database-agnostic


【解决方案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)

【讨论】:

  • 感谢您的建议。问题是不是所有的 postgres db 都实现了unaccent
猜你喜欢
  • 1970-01-01
  • 2010-10-13
  • 2017-04-23
  • 2013-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多