2011-10-21 205 views
4

我使用SQLAlchemy最大列長度配方從我以前的問題(SQLAlchemy - maximum column length)。因爲我升級到SQLAlchemy的0.7時,LengthValidator不能使用以下表達式安裝:SQLAlchemy 0.7 - 最大列長度

inst.impl.extensions.insert(0,LengthValidator(col.type.length))

extension屬性未在SQLAchemy 0.7中定義。有沒有辦法改變配方使用0.7?

感謝,honzas

回答

9

下面是螞蟻的解決方案改寫的SQLAlchemy的事件系統:

from sqlalchemy.ext.declarative import declarative_base 
from sqlalchemy.orm import ColumnProperty 
from sqlalchemy import event 

def check_string_length(cls, key, inst): 
    prop = inst.prop 
    # Only interested in simple columns, not relations 
    if isinstance(prop, ColumnProperty) and len(prop.columns) == 1: 
     col = prop.columns[0] 
     # if we have string column with a length, install a length validator 
     if isinstance(col.type, String) and col.type.length: 
      max_length = col.type.length 
      def set_(instance, value, oldvalue, initiator): 
       if len(value)>max_length: 
        raise ValueError("Length %d exceeds allowed %d" % \ 
              (len(value), max_length)) 
      event.listen(inst, 'set', set_) 

Base = declarative_base() 

event.listen(Base, 'attribute_instrument', check_string_length) 
+0

哇你從哪兒弄來的?我從來沒有看到irc的螞蟻... – zzzeek

+0

@zzzeek這只是螞蟻的彙編回答http://stackoverflow.com/questions/2317081/sqlalchemy-maximum-column-length/2317843#2317843和examples/custom_attributes/listen_for_events。 py –

+0

謝謝,這正是我想要的。 – honzas

1

您可以使用sqlalchemy.orm.validates decorator

@validates('name') 
def validate_name(self, key, name): 
    assert len(name) <= 50 
    return name 
+0

這樣,您必須爲每個列安裝驗證程序,而原始解決方案作者參考時會處理所有字符串列(除內聯合成材料以外的一些罕見情況),而無需額外工作。 –