2013-09-06 14 views
5

Đây là SQL Tôi muốn tạo:Làm thế nào để tạo ra một chỉ số chức năng chữ thường duy nhất bằng cách sử dụng SQLAlchemy trên PostgreSQL?

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

Từ SQLAlchemy Index documentation tôi sẽ mong đợi điều này để làm việc:

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

Nhưng sau khi tôi gọi metadata.create(engine) bảng được tạo ra nhưng chỉ số này không phải là . Tôi đã từ conf import 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) 

Xem định nghĩa bảng trong PostgreSQL Tôi thấy rằng chỉ mục này không được tạo.

\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) 

Làm cách nào để tạo chỉ mục thấp hơn, duy nhất của tôi?

+0

Tôi cũng tò mò về vấn đề này. –

+0

Tại sao bạn cố gắng lấy chữ thường của cột 'INTEGER'. – SingleNegationElimination

+0

@TokenMacGuy Tôi đã sắp hỏi cùng một điều bởi vì điều đó không làm việc và Postgres với ném một lỗi. Tuy nhiên, nếu bạn sử dụng kiểu 'String', thì ví dụ này hoạt động hoàn hảo và không gặp rắc rối. – javex

Trả lời

2

Tôi không biết tại sao bạn muốn lập chỉ mục cột nguyên trong trường hợp thấp hơn; Vấn đề là các sql tạo không 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))' {} 

Mặt khác, nếu bạn sử dụng một loại chuỗi thực tế:

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

Chỉ số này được tạo ra như mong đợi. Nếu vì một lý do rất lạ, bạn đang van lơn về chỉ số vô lý này, bạn chỉ cần phải sửa chữa các loại:

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

nào sản xuất một cách hoàn hảo tốt đẹp:

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

Tôi đã không nhận ra rằng ví dụ của tôi đã cố gắng để viết một số nguyên. Tôi đã cập nhật ví dụ của mình để sử dụng chuỗi, trong đó chỉ mục cũng không được tạo. – skyler

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