2015-06-05 62 views
0

將SQLAlchemy和Python與PostgreSQL配合使用作爲數據庫。我有一個表有超過32列,我收到以下錯誤:PostgreSQL錯誤:在索引中不能使用多於32列

cannot use more than 32 columns in an index

下面是我如何創建表的代碼片段:

class Application(): 
    __tablename__ = 'application' 
    id = Column(Integer, primary_key=True) 
    name = Column(String) 
    value = Column(Integer) 
    # ..and many other columns (45 columns in total) 

    _columns = ['name', 'value'...] # a list of 45 column names 

    __table_args__ = (UniqueConstraint(*_columns),) 

好像有一個構建選項PostgreSQL的增加的列數多於32: http://www.postgresql.org/docs/8.3/static/indexes-multicolumn.html 從上面的鏈接:

This limit can be altered when building PostgreSQL; see the file pg_config_manual.h

但不知道是否在通過SQLAlchemy API創建表時,有一種方法可以將索引限制爲少於32列。我真的不喜歡爲此重建PostgreSQL數據庫。

+4

你如何定義你的表格? (粘貼一些代碼!)我不認爲它會跑出去,並創建像這樣的大量索引。 –

+0

我認爲它可能是使用所有列作爲索引的UniqueConstraint類! – kaush

回答

1

是的,正如你所猜測的那樣,問題是你已經建立了一個包含表格中每一列的唯一約束。這個約束的部分實現是通過在表中引用所有這些列的索引來實現的。你確定這就是你想要的嗎?

如果你有一個表是一種名稱值映射,就像你的表面一樣,包括唯一性約束中的值沒有任何意義。現在你可以有一行(1,'compiler','/usr/bin/gcc')和另一行(2,'compiler','/usr/bin/clang'),這可能(在某些用途中)是奇怪的。

如果您想確保每列中的每個值都是唯一的(這看起來過多,但可能更有意義),您應該創建大約45個,每列一個。

+0

是的,我剛剛證實這確實是使每一列都成爲索引的UniqueConstraint。我也不希望每一列都是獨一無二的,而只是少數。所以我認爲我應該全力以赴。謝謝你的幫助。 – kaush