2011-10-21 16 views
4

私は以前の質問(SQLAlchemy - maximum column length)からSQLAlchemyの最大カラム長レシピを使用しています。SQLAlchemy 0.7 - 最大カラム長

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

:私はSQLAlchemyの0.7にアップグレードするので、LengthValidatorは、以下の式を使用してインストールすることができません

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これはAntsの答え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

元のソリューションの作成者が、追加の努力なしにすべてのString列(インラインコンポジットのようなまれなケースを除く)を処理するのを参照しながら、各列に対してバリデータをインストールする必要があります。 –