突变跟踪
__支持对标量值的就地更改,当标量值拥有父对象时将传播到orm事件中__1. 数据类型
__PostgreSQL的数据类型分为四种:基本数据类型、复合数据类型、域、伪类型。__基本数据类型:integer, char, varchar, bytea等数据类型
复合数据类型:用户自定义的数据类型 create type
域:基本数据类型+约束条件 create domain
伪类型:具有特殊作用的数据类型,只能作为函数的参数或返回值的数据类型
2. SQLAlchemy 数据类型
__基本类型、SQL标准类型、特殊类型、自定义(重写、装饰器、新建)__3. 类型装饰器 - TypeDecorator
python中的字典是一种典型的可变结构,在数据持久化之前我们定制一种数据类型将字典转换成json字符串
from sqlalchemy.types import TypeDecorator, VARCHAR
import json
class JSONEncodedDict(TypeDecorator):
"Represents an immutable structure as a json-encoded string."
impl = VARCHAR # 占位符
# 调用execute方法之前后
def process_bind_param(self, value, dialect):
if value is not None:
value = json.dumps(value)
return value
def process_result_value(self, value, dialect):
if value is not None:
value = json.loads(value)
return value
json的使用仅仅为了实例,sqlalchemy.ext.mutable的继承可以用于任何可变的python类型,包括PickleType, postgresql.ARRAY等。
下面是一个MutableDict字段对象的例子,用于Mutable与python字典。
继承sqlalchemy.ext.mutable时,值会跟踪全部引用它的父对象。
from sqlalchemy.ext.mutable import Mutable
class MutableDict(Mutable, dict):
@classmethod
def coerce(cls, key, value):
"Convert plain dictionaries to MutableDict."
if not isinstance(value, MutableDict):
if isinstance(value, dict):
return MutableDict(value)
# this call will raise ValueError
return Mutable.coerce(key, value)
else:
return value
def __setitem__(self, key, value):
"Detect dictionary set events and emit change events."
dict.__setitem__(self, key, value)
self.changed()