我在JSON中获得了一些数据,其中布尔值为0& 1。
在postgres表中是一个布尔字段,并期望true&假的。
我在加载表时尝试这个:
class PGBool(types.TypeDecorator):
impl = types.BOOLEAN
def process_result_value(self, value, dialect):
#print value
if value is not None:
return bool(value)
return value
def listen(self, table, column_info):
type_ = column_info['type']
print column_info['name'], type_
if str(type_).split('.')[-1] == 'BOOLEAN':
column_info['type'] = PGBool
return column_info
def getTable(self, name):
return sq.Table(
name,
self.meta,
autoload=True,
autoload_with=self.con,
listeners=[
('column_reflect', listen)
]
)
def saveRecord(self, table, data):
..
..
if exist:
self.con.execute(
table.update().where(table.c.id == theGuid),
data
)
else:
self.con.execute(
table.insert(),
data
)
但数据未转换,仍尝试插入0& 1。
答案 0 :(得分:1)
当您使用TypeDecorator
时,需要关注数据的两个方面。一个是进入数据库的数据,另一个是 out 的数据。进入的一侧被称为"绑定参数"而走出去的是"结果"数据。既然你想在这里处理一个INSERT,你就是在绑定方面,所以TypeDecorator看起来像:
from sqlalchemy.types import TypeDecorator, Boolean
class CoerceToBool(TypeDecorator):
impl = Boolean
def process_bind_param(self, value, dialect):
if value is not None:
value = bool(value)
return value