sqlalchemy声明性模型对象上的活动类记录验证
SAValidation的Python项目详细描述
简介
savalidation有助于对sqlalchemy声明性模型进行类似活动记录的验证 物体。
您可以安装in-development version 用easy_install savalidation==dev验证。
主页当前是GitHub repository。
用法示例
下面是examples.py文件中的一个片段:
fromdatetimeimportdatetimeimportformencodeimportsqlalchemyassaimportsqlalchemy.ext.declarativeassadecimportsqlalchemy.sqlassasqlimportsqlalchemy.ormassaormfromsavalidationimportValidationMixin,watch_sessionimportsavalidation.validatorsasvalengine=sa.create_engine('sqlite://')#engine.echo = Truemeta=sa.MetaData()Base=sadec.declarative_base(metadata=meta)Session=saorm.scoped_session(saorm.sessionmaker(bind=engine,autoflush=False))sess=SessionclassFamily(Base,ValidationMixin):__tablename__='families'# SA COLUMNSid=sa.Column(sa.Integer,primary_key=True)createdts=sa.Column(sa.DateTime,nullable=False,default=datetime.now,server_default=sasql.text('CURRENT_TIMESTAMP'))updatedts=sa.Column(sa.DateTime,onupdate=datetime.now)name=sa.Column(sa.Unicode(75),nullable=False,unique=True)reg_num=sa.Column(sa.Integer,nullable=False,unique=True)status=sa.Column(sa.Unicode(15),nullable=False,default=u'active',server_default=u'active')# VALIDATIONSTATUS_CHOICES=(('active','Active'),('inactive','Inactive'),('moved','Moved'),)# will validate nullability and string typesval.validates_constraints()val.validates_one_of('status',[kfork,vinSTATUS_CHOICES])#OTHERdef__str__(self):return'<Family id=%s, name=%s>'%(self.id,self.name)classPerson(Base,ValidationMixin):__tablename__='people'id=sa.Column(sa.Integer,primary_key=True)createdts=sa.Column(sa.DateTime,nullable=False,server_default=sasql.text('CURRENT_TIMESTAMP'))updatedts=sa.Column(sa.DateTime,onupdate=datetime.now)name_first=sa.Column(sa.Unicode(75),nullable=False)name_last=sa.Column(sa.Unicode(75),nullable=False)family_role=sa.Column(sa.Unicode(20),nullable=False)nullable_but_required=sa.Column(sa.Unicode(5))ROLE_CHOICES=(('father','Father'),('mother','Mother'),('child','Child'),)val.validates_constraints(exclude='createdts')val.validates_presence_of('nullable_but_required')val.validates_choices('family_role',ROLE_CHOICES)classReverseConverter(formencode.api.FancyValidator):def_to_python(self,value,state):ifnotisinstance(value,basestring):raiseformencode.Invalid('Must be a string type',value,state)# this reverse a string or list...yah, I know, it looks funnyreturnvalue[::-1]validates_reverse=val.formencode_factory(ReverseConverter)converts_reverse=val.formencode_factory(ReverseConverter,sv_convert=True)classConversionTester(Base,ValidationMixin):__tablename__='conversion_testers'id=sa.Column(sa.Integer,primary_key=True)val1=sa.Column(sa.String(25))val2=sa.Column(sa.String(25))val3=sa.Column(sa.String(25))val4=sa.Column(sa.String(25))validates_reverse('val1')validates_reverse('val2',sv_convert=True)converts_reverse('val3')converts_reverse('val4',sv_convert=False)
请参阅发行版的tests目录中的更多示例。
安装和测试源
(这是一种方式,还有其他方式)
# create a virtualenv # activate the virtualenv $ pip install -e git+git://github.com/blazelibs/sqlalchemy-validation.git@master#egg=savalidation $ pip install nose $ cd src/savalidation/savalidation $ nosetests
已知问题
在ORM映射对象属性上设置的最终值 关系、默认列参数或onupdate列参数,以及可能的其他参数 在验证完成时不可用。
在某些情况下,当 值在orm对象上可用。
不幸的是,如果 slided through违反了db约束。在这种情况下,一个真正的数据库异常 将被抚养。
依赖关系
- sqlalchemy>;0.7.6
- formencode
- python dateutil(用于日期/时间转换器)
- 鼻子(如果您想进行测试)
当前状态
代码本身看起来很稳定,但是api将来可能会改变。
更改日志
0.4.1 2016-11-23发布
- 修复了为包列出的python版本
- 在研读项目 中修复了一个断开的链接
- 更新了Circleci设置并添加了AppVeyor
0.4.0发布日期:2016-06-10
- 增加了对python 3.4+的支持(感谢ji_bire_)
- 在ci上设置连续积分
- 通过codecov的覆盖率报告
0.3.2发布日期:2016-04-20
- 验证数值列值的精度和比例
0.3.1发布日期:2016-02-23
- 修复formencode兼容性,支持formencode 1.2和1.3
0.3.0 2014-09-30发布
- 使用.validates_constraints()和文本列类型修复错误
- 不再需要watch_session(),需要sqlalchemy>;=0.7.6
- 现在beta质量:在生产中使用了很长时间,但没有广泛使用
0.2.1 2013-05-15发布
- 已修复问题6-需要对python dateutil版本进行调整。
0.2.0发布日期:2012-10-24
此版本包含一些bc中断。
- 内部API已清理
- 经过重构以使用sqlalchemy(sa)事件,我们现在可以与&;require兼容 Sa>;=0.7
- 更改:如果使用sa<;0.7.6,则必须对每个 会话的实例(如果正在实例化savalidation模块) 在创建会话之前。
- 更改:验证程序API已更改。如果您已经创建了自定义验证器 您需要查看validators.py中的更改。
- 发送到验证器方法的formencode状态对象已更改 “实例”属性为“实体”。
- 添加before_flush()helper以修饰实体实例方法
- 取消刷新后验证。相反,在插入/更新事件之前
- 现在可用于验证不可为空的外键。
- 取消了对列默认值和服务器默认值的验证支持
值(刷新验证后需要b/c)
- 取消了对列默认值和服务器默认值的验证支持
- formencode模式现在只为每个类创建一次,而不是每个实例,
- 提高性能。
0.1.5发布日期:2011-06-11
- 修复0.1.4版本,该版本不包括版本文件
0.1.4发布日期:2011-06-11
- 将python dateutil dependency更改为<;2.0,2.x用于python 3
0.1.3发布日期:2011-05-19
- 更改sqlalchemy要求,以便安装最新的软件包<;0.7