2010-04-21 13 views

Respuesta

2

SQLite sí permite NOCASE collation en los campos de texto:

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 

y sqlalchemy tiene un operador de collation() en un esquema, pero no estoy seguro cuando se aplica.

4

SQLAlchemy no parece permitir las cláusulas COLLATE en la etapa de creación de tabla (DDL) de forma predeterminada, pero finalmente descubrí una forma de hacer que esto funcione en SQLAlchemy 0.6+. Desafortunadamente, implica un poco de subclases y decoración, pero es razonablemente compacto.

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 

El nuevo tipo de cadena a continuación, se puede utilizar normalmente para la creación de tablas:

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

la esperanza que alguien encuentre esto útil!

3

En el SQLAlchemy 0.8, agregaron el parámetro de intercalación a todos los tipos de cadenas. La palabra clave COLLATE ahora es compatible con varios back-ends de db, incluidos MySQL, SQLite y Postgresql. Usted debe ser capaz de escribir algo como esto:

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

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

+3

Nota: '' No collation' collate' –

Cuestiones relacionadas