我正在使用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
是否可用。
答案 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)