2010-04-21 14 views
6

sqlalchemy'de büyük/küçük harf duyarsız bir dize sütunu oluşturabilir miyim? sqlite kullanarak im, ve probaby, harmanlamayı değiştirerek DB aracılığıyla bunu yapmak için bir yol, ama ben sqlalchemy/python içinde tutmak istiyorum.Büyük/küçük harf duyarsız dize sütunları?

cevap

2

SQLite metin alanları üzerinde NOCASE collation izin yapar:

SQLite version 3.6.22 
sqlite> create table me (name text collate nocase); 
sqlite> .schema 
CREATE TABLE me (name text collate nocase); 
sqlite> insert into me values("Bob"); 
sqlite> insert into me values("alice"); 
sqlite> select * from me order by name; 
alice 
Bob 

ve sqlalchemy bir şema üzerinde collation() bir operatör var, ancak bunu uyguladığınızda emin değilim.

4

SQLAlchemy varsayılan olarak tablo oluşturma (DDL) aşamasında COLLATE maddelerine izin vermiyor gibi görünüyor, ancak sonunda SQLAlchemy 0.6+ üzerinde çalışmanın bir yolunu buldum. Ne yazık ki, biraz alt sınıflandırma ve dekorasyon gerektirir, ancak oldukça kompakttır.

from sqlalchemy import * 
from sqlalchemy.ext.compiler import compiles 
from sqlalchemy.types import TypeDecorator 

class CI_String(TypeDecorator): 
    """ Case-insensitive String subclass definition""" 
    impl = String 
    def __init__(self, length, **kwargs): 
     if kwargs.get('collate'): 
      if kwargs['collate'].upper() not in ['BINARY','NOCASE','RTRIM']: 
       raise TypeError("%s is not a valid SQLite collation" % kwargs['collate']) 
      self.collation = kwargs.pop('collate').upper() 
     super(CI_String, self).__init__(length=length, **kwargs) 

@compiles(CI_String, 'sqlite') 
def compile_ci_string(element, compiler, **kwargs): 
    base_visit = compiler.visit_string(element, **kwargs) 
    if element.collation: 
     return "%s COLLATE %s" % (base_visit, element.collation) 
    else: 
     return base_visit 

yeni dize tip

sonra tabloları oluşturmak için normal olarak kullanılabilir:

just_a_table = Table('table_name', metadata, 
       Column('case_insensitive', CI_String(8, collate='NOCASE'), nullable=False)) 

Umut birisi bu yararlı bulur!

3

SQLAlchemy 0.8'de, tüm String türlerine harmanlama parametresi eklediler. COLLATE anahtar sözcüğü artık MySQL, SQLite ve Postgresql gibi çeşitli db arka uçlarıyla destekleniyor.

my_table = Table('table_name', meta, Column('my_column', 
        String(255, collate = 'NOCASE'), nullable=False)) 

https://bitbucket.org/zzzeek/sqlalchemy/issues/2276

+3

Not: Böyle bir şey yazmak mümkün olmalıdır 'değil collation'' collate' –

İlgili konular