Django查询Unicode问题

时间:2016-01-30 02:53:58

标签: django postgresql python-3.x unicode

编辑#2:

{'sql': 'SELECT "strains_terpene"."id", "strains_terpene"."name", 
"strains_terpene"."short_desc", "strains_terpene"."long_desc", 
"strains_terpene"."aroma", "strains_terpene"."flavor", 
"strains_terpene"."effects" FROM "strains_terpene" WHERE     
"strains_terpene"."name" = \'\xce±-Humulene\'', 'time': '0.000'}

仔细观察看起来似乎django最终可以正确地逃避单引号。不得不采用不同的角度来看这个:

from django.db import connections
connections['default'].queries

所以现在问题仍然存在,为什么即使python3,django和postgres都设置为utf-8,在查询中将unicode编码为local?

原始问题:

这是运行时错误:

strains.models.DoesNotExist: Terpene matching query does not exist.

以下是str(Terpene.objects.filter(name='β-Caryophyllene').query)

SELECT "strains_terpene"."id", "strains_terpene"."name", "strains_terpene"."short_desc", "strains_terpene"."long_desc", "strains_terpene"."aroma", "strains_terpene"."flavor", "strains_terpene"."effects" 
FROM "strains_terpene" 
WHERE "strains_terpene"."name" = ß-Caryophyllene

以下是postgres喜欢看到查询工作的方式:

select * from strains_terpene where name = 'β-Caryophyllene'

我在这里遗漏了什么吗?为什么Django没有用单引号包装我的条件?

  • PostgresDB使用utf-8
  • 进行编码
  • Python 3字符串是unicode

修改

我注意到查询属性也将β转换为ß...

我认为这可能是一个转换问题,考虑到我使用windows cmd作为python shell。

所以我做了一个:

with open('log2.txt','w',encoding='utf-8') as f:
    print(Terpene.objects.filter(name='β-Caryophyllene').query, file=f)

即使直接输出到utf-8纯文本,这里也是结果。

SELECT "strains_terpene"."id", "strains_terpene"."name", "strains_terpene"."short_desc", "strains_terpene"."long_desc", "strains_terpene"."aroma", "strains_terpene"."flavor", "strains_terpene"."effects" 
FROM "strains_terpene" 
WHERE "strains_terpene"."name" = ß-Caryophyllene

所以现在我在两条战线上感到困惑。为什么django选择省略where条件的单引号以及为什么小写beta被转换为大写?

额外信息:

以下是实际代码的部分。

  • 通过CSV导入质量结果。
  • 结果dict存储列与萜类名称之间的映射
  • 第一个log.txt用于验证结果的内容
  • 第二个log1.txt是在将密钥用作查找条件之前验证密钥
  • finally log2.txt验证发送到数据库的sql

首先是代码段:

results = {
            u'α-Pinene': row[7],
            u'β-Pinene': row[8],
            u'Terpinolene': row[9],
            u'Geraniol': row[10],
            u'α-Terpinene': row[11],
            u'γ-Terpinene': row[12],
            u'Camphene': row[13],
            u'Linalool': row[14],
            u'd-Limonene': row[15],
            u'Citral': row[16],
            u'Myrcene': row[17],
            u'α-Terpineol': row[18],
            u'Citronellol': row[19],
            u'dl-Menthol': row[20],
            u'1-Borneol': row[21],
            u'2-Piperidone': row[22],
            u'β-Caryophyllene': row[23],
            u'α-Humulene': row[24],
            u'Caryophyllene Oxide': row[25],
        }
        with open("log.txt", "w") as text_file:
            print(results.keys(), file=text_file)
        for r, v in results.items():
            if '<' not in v:
                value = float(v.replace("%", ""))
                with open("log1.txt", "w") as text2:
                    print(r, file=text2)
                with open("log2.txt", "w", encoding="utf-8") as text3:
                    print(Terpene.objects.filter(name=r).query, file=text3)
                TerpeneResult.objects.create(
                    terpene=Terpene.objects.get(name=r),
                    qa_sample=sample,
                    result=value,
                )

并且log.txt - results.keys():

dict_keys(['dl-Menthol', 'Geraniol', 'Camphene', '1-Borneol', 'Linalool', 
'α-Humulene', 'Caryophyllene Oxide', 'β-Caryophyllene', 'Citronellol', 
'α-Pinene', '2-Piperidone', 'β-Pinene', 'd-Limonene', 'γ-Terpinene',  
'Terpinolene', 'α-Terpineol', 'Myrcene', 'α-Terpinene', 'Citral'])

log1.txt - α-Humulene

最后生成的sql - log2.txt

SELECT "strains_terpene"."id", "strains_terpene"."name", "strains_terpene"."short_desc", "strains_terpene"."long_desc", "strains_terpene"."aroma", "strains_terpene"."flavor", "strains_terpene"."effects" 
FROM "strains_terpene" 
WHERE "strains_terpene"."name" = α-Humulene

请注意,在生成sql的最后一刻,unicode会丢失。

0 个答案:

没有答案