2013-09-06 10 views
5

To SQL Chcę, aby wygenerować:Jak utworzyć unikalny indeks funkcjonalny małych liter przy użyciu SQLAlchemy w PostgreSQL?

CREATE UNIQUE INDEX users_lower_email_key ON users (LOWER(email)); 

Z sqlalchemy Index documentation Spodziewam się to do pracy:

Index('users_lower_email_key', func.lower(users.c.email), unique=True) 

ale po Wzywam metadata.create(engine) tabela jest tworzona, ale wskaźnik ten nie jest . Mam od importu conf dsn, DEBUG

engine = create_engine(dsn.engine_info()) 

metadata = MetaData() 
metadata.bind = engine 

users = Table('users', metadata, 
    Column('user_id', Integer, primary_key=True), 
    Column('email', String), 
    Column('first_name', String, nullable=False), 
    Column('last_name', String, nullable=False), 
    ) 

Index('users_lower_email_key', func.lower(users.c.email), unique=True) 

metadata.create_all(engine) 

Przedstawiamy definicję tabeli w PostgreSQL widzę, że wskaźnik ten nie został utworzony.

\d users 
            Table "public.users" 
    Column |  Type  |      Modifiers 
------------+-------------------+--------------------------------------------------------- 
user_id | integer   | not null default nextval('users_user_id_seq'::regclass) 
email  | character varying | 
first_name | character varying | not null 
last_name | character varying | not null 
Indexes: 
    "users_pkey" PRIMARY KEY, btree (user_id) 

Jak mogę utworzyć niższy, unikalny indeks?

+0

Jestem też ciekaw o tym. –

+0

Dlaczego próbujesz pobrać małą kolumnę 'INTEGER'? – SingleNegationElimination

+0

@TokenMacGuy Miałem właśnie zadać to samo, ponieważ to nie działa, a Postgres zrzuca błąd. Jeśli jednak użyjesz typu 'String', to przykład działa doskonale i bez kłopotów. – javex

Odpowiedz

2

Nie mam pojęcia, dlaczego chcesz indeksować kolumnę całkowitą małymi literami; Problem polega na tym, że wygenerowany sql nie typecheck:

LINE 1: CREATE UNIQUE INDEX banana123 ON mytable (lower(col5)) 
               ^
HINT: No function matches the given name and argument types. You might need to add explicit type casts. 
'CREATE UNIQUE INDEX banana123 ON mytable (lower(col5))' {} 

Z drugiej strony, jeśli używasz rzeczywistego typu ciąg znaków:

Column('col5string', String), 
... 
Index('banana123', func.lower(mytable.c.col5string), unique=True) 

Indeks tworzony jest zgodnie z oczekiwaniami. Jeśli z jakiegoś bardzo dziwnego powodu, jesteś natarczywy o tej absurdalnej indeksie, po prostu trzeba naprawić typy:

Index('lowercasedigits', func.lower(cast(mytable.c.col5, String)), unique=True) 

który wytwarza doskonale ładny:

CREATE UNIQUE INDEX lowercasedigits ON mytable (lower(CAST(col5 AS VARCHAR))) 
+0

Nie zdawałem sobie sprawy, że mój przykład próbował wprowadzić małą liczbę całkowitą. Zaktualizowałem swój przykład, aby użyć łańcucha, w którym nie można również utworzyć indeksu. – skyler

Powiązane problemy