Нечувствительные к регистру строковые столбцы в SQLAlchemy? - PullRequest
8 голосов
/ 21 апреля 2010

Могу ли я создать без учета регистра строки столбца в sqlalchemy? Я использую sqlite, и есть вероятный способ сделать это через БД путем изменения параметров сортировки, но я хочу сохранить его в sqlalchemy / python.

Ответы [ 3 ]

6 голосов
/ 24 июля 2015

В SQLAlchemy 0.8 они добавили параметр сопоставления для всех типов String. Ключевое слово COLLATE теперь поддерживается несколькими базами данных, включая MySQL, SQLite и Postgresql. Вы должны быть в состоянии написать что-то вроде этого:

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

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

5 голосов
/ 24 августа 2012

SQLAlchemy, по-видимому, по умолчанию не разрешает предложения COLLATE на этапе создания таблицы (DDL), но я наконец-то нашел способ заставить это работать на SQLAlchemy 0.6+. К сожалению, он включает в себя немного подклассов и декорирования, но он достаточно компактен.

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

Новый тип строки может затем использоваться для создания таблиц:

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

Надеюсь, кто-нибудь найдет это полезным!

3 голосов
/ 21 апреля 2010

SQLite разрешает сопоставление NOCASE в текстовых полях:

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

, а SQLalchemy имеет оператор collation () в схеме, но я неуверен, когда вы примените его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...