2010-04-21 40 views

Trả lời

2

SQLite không cho phép NOCASE collation trên các lĩnh vực văn bản:

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 

và SQLAlchemy có một nhà điều hành collation() trên một lược đồ, nhưng tôi không chắc chắn khi bạn áp dụng nó.

4

SQLAlchemy dường như không cho phép các mệnh đề COLLATE ở giai đoạn tạo bảng (DDL) theo mặc định, nhưng cuối cùng tôi đã tìm ra cách để làm việc này trên SQLAlchemy 0.6+. Thật không may, nó liên quan đến một chút subclassing và trang trí, nhưng nó hợp lý nhỏ gọn.

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 

Kiểu chuỗi mới sau đó có thể được sử dụng bình thường để tạo bảng:

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

Hope ai đó tìm thấy hữu ích này!

3

Trong SQLAlchemy 0.8, chúng thêm thông số đối chiếu vào tất cả các loại Chuỗi. Từ khóa COLLATE hiện được hỗ trợ bởi một số đầu cuối db bao gồm MySQL, SQLite và Postgresql. Bạn sẽ có thể viết một cái gì đó như thế này:

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

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

+3

Lưu ý: 'collation' không 'collate' –

Các vấn đề liên quan