sqlalchemy声明性模型对象上的活动类记录验证

SAValidation的Python项目详细描述


https://ci.appveyor.com/api/projects/status/92uq13xnk8woa59d?svg=truehttps://circleci.com/gh/blazelibs/sqlalchemy-validation.svg?&style=shieldhttps://codecov.io/github/blazelibs/sqlalchemy-validation/coverage.svg?branch=master

简介

savalidation有助于对sqlalchemy声明性模型进行类似活动记录的验证 物体。

您可以安装in-development versioneasy_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

问题和评论

请访问:http://groups.google.com/group/blazelibs

已知问题

在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

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java Oracle将休眠为ISO 8601日期格式   当有线程时,swing计时器不会停止。睡在Java里面   如何使用swing在java中清空密码字段值(字符串)   如何在编辑文本字段上设置单词java(安卓)   单独类中的java OkHttp请求   java Tomcat配置文件/上下文xml似乎已经崩溃了。请确保它是可分析和有效的。有关详细信息,请参阅服务器日志   java在科尔多瓦的ActivityResult上传递   java如何在映射中保持插入顺序。工厂?   “DataOutputStream”和“ObjectOutputStream”之间的java差异   java从FTP文件列表中获取项目的时间戳   java如何在spring security中为每个人忽略一些资源/URL?   模板类嵌套时新的Java泛型类构造函数问题   java读取并查找文件大小为1GB的行   java如何使用字符串say“stop”停止整数格式的while循环   java是否可以在应用程序启动之间将JVM保留在内存中?   java Springboot出现“出现意外错误(类型=内部服务器错误,状态=500)”的问题