1.在定义ORM模型时校验

sqlalchemy提供validates函数支持对字段的校验

from sqlalchemy.orm import validates

class EmailAddress(Base):
__tablename__ = 'address' id = Column(Integer, primary_key=True)
email = Column(String) @validates('email')
def validate_email(self, key, address):
assert '@' in address
return address

2.全局校验

①.根据sqlalchemy数据类型对应的python_type(注:有些数据类型没有实现python_type这个方法,需重写)

在进行增改.commit()之前,对传入数据校验.字段的数据类型及是否为空可从已定义好的orm model中获取.

获取orm信息

@classmethod
def orm_fields_info(cls):
"""
从ORM中获取字段信息
:param cls:当前资源类
:type cls:类实例
:returns: 返回ORM字段类型,字段是否可空
"""
fields_type = {}
fields_nullable = {}
orm_meta = cls.orm_meta
for prop_name in orm_meta.__dict__:
prop = getattr(orm_meta, prop_name)
if isinstance(prop, attributes.InstrumentedAttribute):
prop = prop.prop
if isinstance(prop, properties.ColumnProperty):
fields_type[prop_name] = prop.columns[0].type
fields_nullable[prop_name] = prop.columns[0].nullable
return fields_type, fields_nullable

根据orm 字段类型的python_type对传入的数据类型进行校验

def validate_data_type(orm_fields_info, field_name, field_value):
fields_type, fields_nullable = orm_fields_info
field_column = fields_type.get(field_name, None)
if field_column:
if not (not field_value and fields_nullable[field_name]):
if hasattr(field_column, 'python_type'):
if not isinstance(field_value, field_column.python_type):
raise exceptions.ValidationError(attribute=field_name_display,
msg=_(
"field [%s] data type didn't match! require [%s],found type [%s]"
% (field_name, field_column.python_type, type(field_value))))

②.利用sqlalchemy event创建通用校验器

from sqlalchemy import Column, Integer, String, DateTime
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import event
import datetime Base= declarative_base() def validate_int(value):
if isinstance(value, basestring):
value = int(value)
else:
assert isinstance(value, int)
return value def validate_string(value):
assert isinstance(value, basestring)
return value def validate_datetime(value):
assert isinstance(value, datetime.datetime)
return value validators = {
Integer:validate_int,
String:validate_string,
DateTime:validate_datetime,
} # this event is called whenever an attribute
# on a class is instrumented
@event.listens_for(Base, 'attribute_instrument')
def configure_listener(class_, key, inst):
if not hasattr(inst.property, 'columns'):
return
# this event is called whenever a "set"
# occurs on that instrumented attribute
@event.listens_for(inst, "set", retval=True)
def set_(instance, value, oldvalue, initiator):
validator = validators.get(inst.property.columns[0].type.__class__)
if validator:
return validator(value)
else:
return value class MyObject(Base):
__tablename__ = 'mytable' id = Column(Integer, primary_key=True)
svalue = Column(String)
ivalue = Column(Integer)
dvalue = Column(DateTime) m = MyObject()
m.svalue = "ASdf"
m.ivalue = ""
m.dvalue = "not a date"

sqlalchemy orm数据类型验证方法比较的更多相关文章

  1. Python-12-MySQL & sqlalchemy ORM

    MySQL MySQL相关文章这里不在赘述,想了解的点击下面的链接: >> MySQL安装 >> 数据库介绍 && MySQL基本使用 >> MyS ...

  2. sqlalchemy ORM

    本节内容       ORM介绍     sqlalchemy安装     sqlalchemy基本使用     多外键关联     多对多关系   1. ORM介绍   orm英文全称object ...

  3. sqlalchemy ORM模块使用介绍

    前几天用到了flask框架,所以顺带介绍了flask-sqlalchemy扩展模块,去瞄一眼,由于有好多非web的python程序也用到了数据库,所以今天分享一下sqlalchemy的模块的使用方法. ...

  4. python 之路,Day11 (下)- sqlalchemy ORM

    python 之路,Day11 - sqlalchemy ORM   本节内容 ORM介绍 sqlalchemy安装 sqlalchemy基本使用 多外键关联 多对多关系 表结构设计作业 1. ORM ...

  5. python之SQLAlchemy ORM 上

    前言: SQLAlchmey是暑假学的,当时学完后也没及时写博客整理下.这篇博客主要介绍下SQLAlchemy及基本操作,写完后有空做个堡垒机小项目.下篇博客整理写篇关于Web框架和django基础~ ...

  6. Python sqlalchemy orm 常用操作

    增add # 创建表1 # 注:高级封装 import sqlalchemy # 调用链接数据库 from sqlalchemy import create_engine # 调用基类Base fro ...

  7. sqlalchemy orm 操作 MySQL

    一.ORM介绍 orm英文全称object relational mapping,是对象映射关系程序,简单来说类似python这种面向对象的程序来说一切皆对象,但是我们使用的数据库却都是关系型的,为了 ...

  8. python之SQLAlchemy ORM

    前言: 这篇博客主要介绍下SQLAlchemy及基本操作,写完后有空做个堡垒机小项目.有兴趣可看下python之数据库(mysql)操作.下篇博客整理写篇关于Web框架和django基础~~ 一.OR ...

  9. SQLAlchemy ORM教程之二:Query

    from:https://www.jianshu.com/p/8d085e2f2657 这是继SQLAlchemy ORM教程之一:Create后的第二篇教程.在上一篇中我们主要是解决了如何配置ORM ...

随机推荐

  1. 查询sqlserver数据库视图、存储过程等包含特定的字符串

    SELECT A.name , B.definition FROM SYS.objects A INNER JOIN sys.sql_modules B ON A.object_id = B.obje ...

  2. Leetcode:Regular Expression Matching分析和实现

    题目大意是要求我们实现一个简单的正则表达式全匹配判断.其中正则表达式中只包含一般字符,以及全匹配字符.和变长字符*.其中.可以匹配一个字符,而*与前一个字符相关联,x*可以被看作任意多个x(0到正无穷 ...

  3. 小程序为什么脚本内不能使用window等对象

    小程序(应用号)内不能使用window等对象. 页面的脚本逻辑在是在JsCore中运行,JsCore是一个没有窗口对象的环境,所以不能再脚本中使用window,也无法在脚本中操作组件.

  4. c语言实践 1/1+1/2+1/3+1/4+...+1/n

    给定一个n求这个分式的和. int n = 1; float sum = 0; float frac = 0; int i = 1; scanf_s("%d",&n); w ...

  5. 618F Double Knapsack

    传送门 题目大意 分析 代码 #include<iostream> #include<cstdio> #include<cstring> #include<s ...

  6. Html.Partial方法和Html.RenderPartial方法

    分布视图 PartialView 一般是功能相对独立的,类似用户控件的视图代码片段,可以被多个视图引用,引用方式如下. 1,Html.Partial方法和Html.RenderPartial方法 静态 ...

  7. C# 随机数 Radom 循环生成同一的数字

    错误:在一个循环结构中,利用下列代码生成随机数,发生生成的随机数是一样的! for (int i = 0; i < myArray.Length; i++) //给数组赋值 { Random m ...

  8. 进程间传递文件描述符fd

    众所周知,子进程会继承父进程已经打开的文件描述符fd,但是fork之后的是不会被继承的,这个时候是否无能无力了?答应是NO.Linux提供了一个系统调用sendmsg,借助它,可以实现进程间传递文件描 ...

  9. 状态压缩DP----HDU2809

    状态压缩DP的一道较不错的入门题,第二次做这类问题,感觉不是很顺手,故记录下来. 题目的意思就是吕布战群雄,先给你6个数,分别是吕布的攻击值,防御值,生命值,升级后此三值各自的增量,然后是对手的个数n ...

  10. android获取USB设备的名称

    1.注释内 .是三星设备可能不支持,需要更换的代码. 2.mUsbManager.是getSystemService(Context.USB_SERVICE)获的. 3. 从stackoverflow ...