thrift ttypes 与 sqlalchemy metadata 进行 完全/部分 成员拷贝
- 作者: 袁氏宗亲
- 来源: 51数据库
- 2022-08-12
#encoding:utf8
from datetime import datetime
from sqlalchemy.engine import RowProxy
def Print(object):
print object
for key, value in object.__dict__.items():
print '%-20r:%-r'%(key, value)
def Replicate(dir=True, debug=False, \
tcls=None, tobj=None, mcls=None, mobj=None, \
tencoding='utf-8', mencoding='unicode', \
include=None, exclude=None, dt=None, union=True,\
callback_list=None):
src_obj = tobj if dir else mobj
dst_obj = mobj if dir else tobj
src_cls = tcls if dir else mcls
dst_cls = mcls if dir else tcls
def get_source_fields(debug, src_obj, include, exclude):
if isinstance(src_obj, RowProxy):
src_obj_items = src_obj.items()
else:
src_obj_items = src_obj.__dict__.items()
inc_keys = set(include) if include else \
set([item[0] for item in src_obj_items])
exc_keys = set(exclude) if exclude else set()
com_keys = inc_keys & exc_keys
dif_keys = inc_keys - com_keys
fields = dict()
for key in dif_keys:
value = getattr(src_obj, key)
if value is None:
continue
fields[key] = value
return fields
def handle_ignore(union, key, dst_obj):
rv = False
try:
getattr(dst_obj, key)
except Exception, e:
if not union:
rv = True
return rv
def handle_coding(dir, value):
if dir and \
isinstance(value, basestring) and \
not isinstance(value, unicode):
value = value.decode(tencoding)
if not dir and \
isinstance(value, unicode):
value = value.encode(tencoding)
return value
def handle_datetime(key, value, dt):
str_to_dt = lambda x: datetime.strptime(x, "%Y-%m-%d %H:%M:%S")
dt_to_str = lambda x: x.strftime('%Y-%m-%d %H:%M:%S')
if key in dt:
value = str_to_dt(value) if dir else dt_to_str(value)
return value
if src_obj is None:
raise Exception('source obj should not be None!')
dst_obj = dst_obj if dst_obj else dst_cls()
fields = get_source_fields(debug, src_obj, include, exclude)
for key, value in fields.items():
if handle_ignore(union, key, dst_obj):
continue
value = handle_coding(dir, value)
value = handle_datetime(key, value, dt)
setattr(dst_obj, key, value)
if callback_list:
for callback in callback_list:
callback(dst_obj)
if debug:
Print(dst_obj)
return dst_obj
推荐阅读
热点文章
Discord.py(重写)on_member_update 无法正常工作
0
Discord.py 在 vc 中获取用户分钟数
0
discord.py 重写 |为我的命令出错
0
Discord.py rewrite 如何 DM 命令?
0
播放音频时,最后一部分被切断.如何解决这个问题?(discord.py)
0
在消息删除消息 Discord.py
0
如何使 discord.py 机器人私人/直接消息不是作者的人?
0
(Discord.py) 如何获取整个嵌入内容?
0
Discord bot 尽管获得了许可,但不能提及所有人
0
Discord.py discord.NotFound 异常
0
