13

では、Python 2.5 の組み込みのデフォルト sqlite3 を使用していて、次のコードを持つ Django モデル クラスがあるとします。

class SomeEntity(models.Model):
    some_field = models.CharField(max_length=50, db_index=True, unique=True)

管理インターフェイスのセットアップが完了しましたが、some_field の一意の制約が大文字と小文字を区別。

一意性をチェックするときに、機密性の高い比較でsqlite に強制的にケースを実行させる方法はありますか?

Djangoのドキュメントでこれのオプションを見つけることができないようです。sqliteに直接実行して、希望どおりに動作させることができるかどうか疑問に思っています。:-)

4

3 に答える 3

10

はい、これは次のコマンドを使用してテーブルに一意のインデックスを追加することで簡単に実行できます。

CREATE UNIQUE INDEX uidxName on mytable (myfield COLLATE NOCASE)

非 ASCII 文字の大文字と小文字を区別しない必要がある場合は、次のようなコマンドを使用して独自の COLLATION を登録する必要があります。

次の例は、「間違った方法」でソートするカスタム照合を示しています。

import sqlite3

def collate_reverse(string1, string2):
    return -cmp(string1, string2)

con = sqlite3.connect(":memory:")
con.create_collation("reverse", collate_reverse)

cur = con.cursor()
cur.execute("create table test(x)")
cur.executemany("insert into test(x) values (?)", [("a",), ("b",)])
cur.execute("select x from test order by x collate reverse")
for row in cur:
    print row
con.close()

ここに示されている sqlite3 の追加の python ドキュメント

于 2009-01-22T22:18:21.477 に答える
3

おそらく、カスタム モデル フィールドを作成して使用することができます。これは CharField のサブクラスになりますが、「text collat​​e nocase」を返すdb_typeメソッドを提供します

于 2008-11-10T00:00:26.960 に答える