5

SQLAlchemy を使用してデータベースと通信しています。多くの人が私のアプリケーションを (少なくとも最初は) 使用しないため、SQLite が最も迅速で簡単なバックエンドであると考えています。

がありUser、文字列ベースの一意の ID があります (例:asdf@asdf.comまたは ) Mr. Fnord。ID の形式は気にしません。一意であることだけです。ただし、大文字と小文字を区別しない一意性にしたいと考えています。したがってMr. Fnord、 とmr. fNoRdは同等です。

明らかにCOLLATE、使用できるスキーマの設定がありますが、(少なくとも sqlite では) 単純な設定ではないようです。私の解決策は、クラスのプロパティを使用して、テーブルに移動する前にすべてを小文字にすることでしたが、それは脆弱/ハックのように見えました。

プロパティはすべての小文字を処理するための最良の方法ですか、それとも SQLAlchemy/SQLite を介して大文字と小文字を区別しないようにするより良い方法はありますか?

4

1 に答える 1

10

私はこれを個人的に試したことはありませんが、おそらくカスタム比較演算子を使用できますか? いえ

class CaseInsensitiveColumnComparator(ColumnProperty.Comparator):
    def __eq__(self, other):
        return func.lower(self.__clause_element__()) == func.lower(other)

このように、ID は大文字と小文字を区別せずに保存できますが、小文字として比較されます。


別のアイデア - sqlalchemy.types.Textを拡張 し、それを ID に使用します。

import sqlalchemy.types as types

class LowerCaseText(types.TypeDecorator):
    '''Converts strings to lower case on the way in.'''

    impl = types.Text

    def process_bind_param(self, value, dialect):
        return value.lower()

class User(Base):
    __tablename__ = 'user'
    id = Column(LowerCaseText, primary_key=True)
    ...
于 2012-12-27T02:53:34.377 に答える