diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..2d85ac68819d05771d0cc246b0351b7c616804ab
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,8 @@
+.idea
+__pycache__/
+setup.py
+upload.bat
+pyproject.toml
+delete.py
+*.pyc
+venv
\ No newline at end of file
diff --git a/.idea/.gitignore b/.idea/.gitignore
deleted file mode 100644
index 8f02d69fcb5a98d02eebec4fb93cab6b854c9dee..0000000000000000000000000000000000000000
--- a/.idea/.gitignore
+++ /dev/null
@@ -1,8 +0,0 @@
-# Default ignored files
-/shelf/
-/workspace.xml
-# Datasource local storage ignored files
-/../../../../:\Github\CACodeFramework-python-ORM\.idea/dataSources/
-/dataSources.local.xml
-# Editor-based HTTP Client requests
-/httpRequests/
diff --git a/.idea/CACodeFramework-python-ORM.iml b/.idea/CACodeFramework-python-ORM.iml
deleted file mode 100644
index 5ed0139f27bed0fe8b3612df9b3ca502d70295bb..0000000000000000000000000000000000000000
--- a/.idea/CACodeFramework-python-ORM.iml
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml
deleted file mode 100644
index da484797c158b883f2d96a10bf70ccfcdca0d2fe..0000000000000000000000000000000000000000
--- a/.idea/inspectionProfiles/Project_Default.xml
+++ /dev/null
@@ -1,38 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml
deleted file mode 100644
index 105ce2da2d6447d11dfe32bfb846c3d5b199fc99..0000000000000000000000000000000000000000
--- a/.idea/inspectionProfiles/profiles_settings.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
deleted file mode 100644
index d56657add3eb3c246989284ec6e6a8475603cf1d..0000000000000000000000000000000000000000
--- a/.idea/misc.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-
-
-
-
\ No newline at end of file
diff --git a/.idea/modules.xml b/.idea/modules.xml
deleted file mode 100644
index 99e9e955e8d95bcaddbec9f85230693536e2e743..0000000000000000000000000000000000000000
--- a/.idea/modules.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
deleted file mode 100644
index 94a25f7f4cb416c083d265558da75d457237d671..0000000000000000000000000000000000000000
--- a/.idea/vcs.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
-
-
\ No newline at end of file
diff --git a/CACodeFramework/MainWork/Annotations.py b/CACodeFramework/MainWork/Annotations.py
deleted file mode 100644
index 2f3df4be341a21106a49e6b000b51082e6ba9fa7..0000000000000000000000000000000000000000
--- a/CACodeFramework/MainWork/Annotations.py
+++ /dev/null
@@ -1,92 +0,0 @@
-def Table(name, msg, **kwargs):
- """
- 标注该类为一个表
- :param name:表的名称
- :param msg:表的描述
- :return:
- """
-
- def set_to_field(func):
- setattr(func, '__table_name__', name)
- setattr(func, '__table_msg__', msg)
- for key, value in kwargs.items():
- setattr(func, key, value)
- return func
-
- return set_to_field
-
-
-def Operations():
- """
- 标注该类为一个操做
- :return:
- """
-
- def set_to_field(func):
- print('1111111')
- return func
-
- return set_to_field
-
-
-def Before(function):
- """
- 切入操做,在执行函数之前切入指定函数
-
- 切入:
-
- 在执行函数之前首先执行指定操做称为切入
-
- """
-
- def set_to_field(func):
- print('1111111')
- return func
-
- return set_to_field
-
-
-def After(function):
- """
- 切出操做,在执行函数之前切出指定函数
-
- 切出:
-
- 在指定函数调用完毕时执行得操做成为切除
- """
-
- def set_to_field(func):
- print('1111111')
- return func
-
- return set_to_field
-
-
-from functools import wraps
-
-
-def decorater(func):
- @wraps(func) # 保持原函数名不变
- def wrapper(*args, **kwargs):
- print('位置参数:{}'.format(args))
- print('关键字参数:{}'.format(kwargs))
- res = func(*args, **kwargs)
- print('装饰器内函数名:%s' % func.__name__)
- print('返回值:%s' % res)
- print('函数func所属的类:%s' % func.__qualname__)
- print('被调用时的行号:', sys._getframe().f_back.f_lineno)
- return res
-
- return wrapper
-
-
-class Name():
- @decorater
- def func2(self, *args, **kwargs):
- return 'return'
-
-
-if __name__ == '__main__':
- a = Name()
- a.func2(1, 2, a=3, b=4)
- print('装饰外内函数名:%s' % a.func2.__name__)
diff --git a/CACodeFramework/MainWork/CACodeCustomizeAdapter.py b/CACodeFramework/MainWork/CACodeCustomizeAdapter.py
new file mode 100644
index 0000000000000000000000000000000000000000..6fdced34091d9ff9f77aa48011ec93b6b64b12d4
--- /dev/null
+++ b/CACodeFramework/MainWork/CACodeCustomizeAdapter.py
@@ -0,0 +1,29 @@
+from CACodeFramework.cacode.Serialize import QuerySet
+from CACodeFramework.field.MySqlDefault import MySqlFields_Default
+
+
+class Adapter(object):
+ """
+ 适配器,将sql方言适配到ORM框架中,实现sql自由
+
+
+ 从配置表中开始配置sql方言,继承SqlLanguage类并实现抽象方法,开启
+
+
+
+ """
+
+ def __init__(self, repositoryId, serializer=QuerySet, sqlFields=MySqlFields_Default):
+ self.repositoryId = repositoryId
+ self.serializer = serializer
+ self.sqlFields = sqlFields()
+ self.sql = []
+
+ def getFormId(self, obj_id):
+ pass
+
+ def setField(self, string):
+ """
+ 设置一个字段
+ """
+ self.sql.append("{}{}{}".format(self.sqlFields.space, string, self.sqlFields.space))
diff --git a/CACodeFramework/MainWork/CACodePureORM.py b/CACodeFramework/MainWork/CACodePureORM.py
index 95ae8e6a61402994d50ea2facd11e1ce3b3f9b97..ad58539ebe4a24d7569c7acfd97b2f80c15fc47c 100644
--- a/CACodeFramework/MainWork/CACodePureORM.py
+++ b/CACodeFramework/MainWork/CACodePureORM.py
@@ -1,8 +1,9 @@
-# 纯净ORM
-from CACodeFramework.MainWork.opera import obj_dict, op_db
+from CACodeFramework.cacode.Serialize import QuerySet
+from CACodeFramework.exception import e_fields
+from CACodeFramework.util.Log import CACodeLog
from CACodeFramework.util.ParseUtil import ParseUtil
-from CACodeFramework.field.sql_fields import *
+from CACodeFramework.field.MySqlDefault import MySqlFields_Default
class CACodePureORM(object):
@@ -16,19 +17,37 @@ class CACodePureORM(object):
上手快
"""
- def __init__(self, repository):
+ def __init__(self, repository, serializer=QuerySet, sqlFields=MySqlFields_Default()):
"""
初始化ORM
+
+
+ 自定义方言除了可使用默认已存在的方法,还可以使用自定义sql方言拼接
+
:param repository:仓库
- """
- self.parses = op_db.parses()
+ :param sqlFields:sql方言的对象,默认使用MysqlFieldDefault设置
+s """
self.args = []
self.params = []
+ self.sqlFields = sqlFields
if repository is None:
- raise SyntaxError('')
+ CACodeLog.err(AttributeError, 'Repository is null,Place use repository of ORM framework')
self.repository = repository
- self.__table_name__ = '{}{}{}'.format(subscript, repository.__table_name__, subscript)
- self.parses = obj_dict.parses()
+ self.__table_name__ = '{}{}{}'.format(self.sqlFields.subscript, repository.__table_name__,
+ self.sqlFields.subscript)
+
+ self.first_data = False
+ self.serializer = serializer
+
+ def top(self):
+ return self.find().limit(1)
+
+ def first(self):
+ """
+ 是否只返回第一行数据
+ """
+ self.first_data = True
+ return self
# ------------------------主键--------------------------
@@ -43,7 +62,7 @@ class CACodePureORM(object):
# 添加insert关键字
# self.args.append(insert_str)
# self.args.append('{}{}'.format(self.__table_name__, left_par))
- sql = obj_dict.parses().parse_insert(pojo, self.__table_name__.replace('`', ''))
+ sql = self.repository.config_obj.parse_insert_pojo(pojo, self.__table_name__.replace('`', ''))
self.args.append(sql['sql'])
self.params = sql['params']
@@ -74,8 +93,8 @@ class CACodePureORM(object):
"""
删除
"""
- self.args.append(delete_str)
- self.args.append(from_str)
+ self.args.append(self.sqlFields.delete_str)
+ self.args.append(self.sqlFields.from_str)
self.args.append(self.__table_name__)
return self
@@ -85,7 +104,7 @@ class CACodePureORM(object):
example:
update().set(key=value).where(key1=value1)
"""
- update_sql = '%s%s' % (update_str, str(self.__table_name__))
+ update_sql = '%s%s' % (self.sqlFields.update_str, str(self.__table_name__))
self.args.append(update_sql)
return self
@@ -101,7 +120,7 @@ class CACodePureORM(object):
更新:
如果args字段长度为0,默认为查找全部
"""
- self.args.append(find_str)
+ self.args.append(self.sqlFields.find_str)
fields = ''
# 如果有as字段
asses = None
@@ -137,11 +156,11 @@ class CACodePureORM(object):
fs_cp = []
for i, v in enumerate(fs):
if asses[i] is not None:
- self.args.append('{}{}{}'.format(v, asses_str, asses[i]))
+ self.args.append('{}{}{}'.format(v, self.sqlFields.asses_str, asses[i]))
else:
self.args.append(v)
# 逗号
- self.args.append(comma)
+ self.args.append(self.sqlFields.comma)
else:
self.args.append(fields)
if asses is not None:
@@ -159,7 +178,7 @@ class CACodePureORM(object):
find('all').order_by('param').end()
find('all').order_by('p1','p2').desc().limit(10,20)
"""
- return self.by_opera(field=order_by_str, args_list=args)
+ return self.by_opera(field=self.sqlFields.order_by_str, args_list=args)
def group_by(self, *args):
"""
@@ -167,7 +186,7 @@ class CACodePureORM(object):
example:
select shop_id,count(*) as count from comments group by shop_id having count>1;
"""
- return self.by_opera(field=group_by_str, args_list=args)
+ return self.by_opera(field=self.sqlFields.group_by_str, args_list=args)
def by_opera(self, field, args_list):
"""
@@ -175,11 +194,11 @@ class CACodePureORM(object):
"""
self.args.append(field)
for i in args_list:
- self.args.append(subscript)
+ self.args.append(self.sqlFields.subscript)
self.args.append(i)
- self.args.append(subscript)
- self.args.append(ander_str)
- self.rep_sym(ander_str, space)
+ self.args.append(self.sqlFields.subscript)
+ self.args.append(self.sqlFields.ander_str)
+ self.rep_sym(self.sqlFields.ander_str, self.sqlFields.space)
return self
def where(self, **kwargs):
@@ -199,10 +218,10 @@ class CACodePureORM(object):
find('ALL').where(param='*10-1==12')
find('ALL').where(param='/10+1==12')
"""
- self.args.append(where_str)
+ self.args.append(self.sqlFields.where_str)
for key, value in kwargs.items():
sym = '='
- if len(str(value)) > 2 and str(value)[0:2] in symbol:
+ if len(str(value)) > 2 and str(value)[0:2] in self.sqlFields.symbol:
sym = value[0:2]
value = str(value)[2:len(str(value))]
if sym == '==':
@@ -212,9 +231,9 @@ class CACodePureORM(object):
if sym == '<<':
sym = '<'
self.args.append('`{}`{}%s'.format(key, sym))
- self.args.append(ander_str)
+ self.args.append(self.sqlFields.ander_str)
self.params.append(value)
- self.rep_sym(ander_str, '')
+ self.rep_sym(self.sqlFields.ander_str)
return self
@@ -227,12 +246,13 @@ class CACodePureORM(object):
find('all').limit(star=10,end=20)
find('all').limit(end=10)
"""
- self.args.append(limit_str)
+ self.args.append(self.sqlFields.limit_str)
# 死亡空格
if end is None:
- limit_param = '{}{}{}'.format(space, star, space)
+ limit_param = '{}{}{}'.format(self.sqlFields.space, star, self.sqlFields.space)
else:
- limit_param = '{}{}{}{}{}'.format(space, star, comma, end, space)
+ limit_param = '{}{}{}{}{}'.format(self.sqlFields.space, star, self.sqlFields.comma, end,
+ self.sqlFields.space)
self.args.append(limit_param)
return self
@@ -244,7 +264,13 @@ class CACodePureORM(object):
find('all').desc().end()
find('all').order_by('param').desc().limit(10,20)
"""
- self.args.append(desc_str)
+
+ if self.sqlFields.order_by_str not in self.args:
+ raise CACodeLog.err(AttributeError,
+ e_fields.CACode_SQLERROR(
+ 'There is no `order by` field before calling `desc` field,You have an error in your SQL syntax'))
+
+ self.args.append(self.sqlFields.desc_str)
return self
def set(self, **kwargs):
@@ -254,14 +280,14 @@ class CACodePureORM(object):
update('table').set('param','value').end()
update('table').set('param1','value1').where('param2=value2').end()
"""
- self.args.append(set_str)
+ self.args.append(self.sqlFields.set_str)
_size = len(kwargs.keys())
for key, value in kwargs.items():
- self.args.append('`{}`{}%s'.format(key, eq))
+ self.args.append('`{}`{}%s'.format(key, self.sqlFields.eq))
# set是加逗号不是and
- self.args.append(comma)
+ self.args.append(self.sqlFields.comma)
self.params.append(value)
- self.rep_sym(comma, '')
+ self.rep_sym(self.sqlFields.comma)
return self
# ------------------------预设符--------------------------
@@ -274,7 +300,7 @@ class CACodePureORM(object):
update('table').set('param1','value1').and().set('param2','value2').end()
update('table').set('param1','value1').and().set('param2','value2').where('param3=value3').end()
"""
- self.args.append(ander_str)
+ self.args.append(self.sqlFields.ander_str)
return self
def run(self):
@@ -282,12 +308,12 @@ class CACodePureORM(object):
最终执行任务
"""
sql = ''
- conf = self.repository.config_obj.conf
+ conf = self.repository.config_obj.get_dict()
print_sql = 'print_sql' in conf.keys() and conf['print_sql'] is True
last_id = 'last_id' in conf.keys() and conf['last_id'] is True
for i in self.args:
sql += i
- if find_str in sql:
+ if self.sqlFields.find_str in sql:
_result = self.repository.db_util.select(
sql=sql,
params=self.params,
@@ -296,7 +322,7 @@ class CACodePureORM(object):
)
_result_objs = []
for i in _result:
- _obj = self.parses.parse_obj(data=i, participants=self.repository.participants)
+ _obj = ParseUtil.parse_obj(data=i, instance=self.repository.instance)
_result_objs.append(_obj)
_result = _result_objs
else:
@@ -309,14 +335,19 @@ class CACodePureORM(object):
# 清空资源,为下一次使用做准备
self.args.clear()
self.params.clear()
- return _result
+ if self.first_data:
+ if type(_result) is list or type(_result) is tuple:
+ return self.serializer(instance=self.repository.instance, base_data=_result).first()
+ else:
+ q = self.serializer(instance=self.repository.instance, base_data=_result)
+ return q
def con_from(self):
"""
如果没有被from包含,则在末尾加上from __table_name__关键字
"""
- if from_str not in self.args:
- self.args.append(from_str)
+ if self.sqlFields.from_str not in self.args:
+ self.args.append(self.sqlFields.from_str)
# 然后加上表名
self.args.append(self.__table_name__)
@@ -336,3 +367,22 @@ class CACodePureORM(object):
def end(self):
return self.run()
+
+ def adapter(self):
+ """
+ 适配器:
+ 将当前ORM对象转换为可自定义sql方言的适配器并使用方法的__name__值作为方法名调用,
+
+ 请注意,结尾使用的`_str`严格按照下划线加小写方式定义,大写不做识别处理,默认当成无效字符销毁在内存中
+
+ 名字格式:
+ 示例:
+ select_str:以关键字开头,_str结尾
+ order_by_str:多个字段以下划线分割,_str结尾
+
+ 实际:
+ select_all_from_demo_where_id_str
+
+
+ """
+ pass
diff --git a/CACodeFramework/MainWork/CACodeRepository.py b/CACodeFramework/MainWork/CACodeRepository.py
index 4fd0061f59778085aa3c13cbeb3fb3e4b7096ff7..10293a80f7c03805a85469332fcee9f2d5776af2 100644
--- a/CACodeFramework/MainWork/CACodeRepository.py
+++ b/CACodeFramework/MainWork/CACodeRepository.py
@@ -1,43 +1,30 @@
import copy
-from CACodeFramework.MainWork.opera import op_db
+from CACodeFramework.cacode.Serialize import QuerySet
+from CACodeFramework.exception import e_fields
+from CACodeFramework.field import MySqlDefault
+from CACodeFramework.opera import op_db
from CACodeFramework.util.Log import CACodeLog
from CACodeFramework.MainWork.CACodePureORM import CACodePureORM
from CACodeFramework.util import DbUtil
-import threading
# 每个任务唯一ID
import uuid
-# threadLocal 避免线程干扰
-t_local = threading.local()
+# from CACodeFramework.util.ParseUtil import ParseUtil
-# 线程锁
-
-class LogObj(CACodeLog):
- """
- 继承CACodeLog,配置
- """
-
- def __init__(self, **kwargs):
- """
- 继承原始父类
- """
- super(LogObj, self).__init__(**kwargs)
-
-
-class Repository(object):
+class Repository:
"""
- POJO类
- 继承该类表名此类为数据库的pojo类
- 需要配合:@Table(name, msg, **kwargs)使用
"""
- def __init__(self, config_obj=None, participants=None, log_conf=None, close_log=False):
- """作者:CACode 最后编辑于2021/4/12
+ def __init__(self, config_obj=None, instance=None, log_conf=None, close_log=False, serializer=QuerySet, **kwargs):
+ """作者:CACode 最后编辑于2021/4/30
通过继承此类将数据表实体化
@@ -47,58 +34,121 @@ class Repository(object):
无需担心类型问题,无需担心datetime无法转换
使用方法:
- #加入Table注解,并标注表名与描述,因考虑后期优化问题,请务必填写MSG参数
+ #加入Table注解,并标注表名与描述,因考虑使用者后期优化问题,请务必填写MSG参数
@Table(name="demo_table", msg="demo message")
#继承Repository并得到相对应的半自动ORM操做
class TestClass(Repository):
# 初始化并super配置
- def __init__(self):
- super(TestClass, self).__init__(config_obj=ConF(), participants=Demo())
+ def __init__(self,**kwargs):
+ super(DemoTable, self).__init__(config_obj=ConF(), log_conf={
+ 'path': "/log/",
+ 'save_flag': True
+ }, **kwargs)
初始化配置:
使用本类需要携带一个来自CACodeFramework.util.Config.config的配置类,详见:CACodeFramework.util.Config.config
Attributes:
+ 以下的字段均可覆盖重写
+
+ config_obj:数据源配置类
+
+ log_conf:日志配置工具
+
+ log_obj:日志对象
+
+ close_log:是否关闭日志
+
+ serializer:序列化使用的类,默认使用CACodeFramework.cacode.Serialize.QuerySet
- config_obj:配置类,继承自CACodeFramework.util.Config.config类
+ instance:实例
- participants:参与解析的对象
+ __table_name__:表名称
+
+ operation:操作类的实现
+
+ fields:操作的字段
+
+ sqlFields:sql方言
+
+ :param config_obj:配置类
+ :param log_conf:日志配置类
+ :param close_log:是否关闭日志显示功能
+ :param serializer:自定义序列化器,默认使用CACodeFramework.cacode.Serialize.QuerySet
"""
+ # 以下使用ParseUtil将所有参数替换为可动态修改
+ # 有没有关闭日志
+ # 数据源配置
+ self.ParseUtil = config_obj
+ ParseUtil = self.ParseUtil
+ ParseUtil.set_field_compulsory(self, key='config_obj', data=kwargs, val=config_obj)
+ ParseUtil.set_field_compulsory(obj=self, data=kwargs, key='abs', val=False)
+ # 当本类为抽象类时,仅设置所需要的值
+ ParseUtil.set_field_compulsory(self, key='close_log', data=kwargs, val=close_log)
+ if hasattr(self, 'close_log') and not self.close_log and not self.abs:
+ CACodeLog.warning(obj=self, msg='Being Initialize this object')
+ # 有没有表名
+ ParseUtil.set_field_compulsory(self, key='__table_name__', data=kwargs,
+ val=self.__table_name__ if hasattr(self, '__table_name__') else
+ "`__table_name__` parsing failed")
+ # 参照对象
+ ParseUtil.set_field_compulsory(self, key='instance', data=kwargs, val=instance)
+ # 取得字段的名称
+ ParseUtil.set_field_compulsory(self, key='fields', data=kwargs, val=list(instance.getFields().keys()))
+ # 当当前类为抽象类时,为类取消初始化数据库配置
+ if not self.abs:
+ # 操作类
+ ParseUtil.set_field_compulsory(self, key='operation', data=kwargs, val=op_db.DbOperation())
+ # 获取sql方言配置
+ ParseUtil.set_field_compulsory(self, key='sqlFields', data=kwargs, val=MySqlDefault.MySqlFields_Default())
+ # 连接池
+ if hasattr(self, 'config_obj') and self.config_obj:
+ self.db_util = DbUtil.Db_opera(host=ParseUtil.fieldExist(self.config_obj, 'host'),
+ port=ParseUtil.fieldExist(self.config_obj, 'port'),
+ user=ParseUtil.fieldExist(self.config_obj, 'user'),
+ password=ParseUtil.fieldExist(self.config_obj, 'password'),
+ database=ParseUtil.fieldExist(self.config_obj, 'database'),
+ charset=ParseUtil.fieldExist(self.config_obj, 'charset'),
+ creator=ParseUtil.fieldExist(self.config_obj, 'creator',
+ raise_exception=True),
+ POOL=None if 'POOL' not in kwargs.keys() else kwargs['POOL'])
+ else:
+ CACodeLog.err(AttributeError, e_fields.Miss_Attr('`config_obj` is missing'))
+
+ ParseUtil.set_field_compulsory(self, key='result', data=kwargs, val=None)
+ ParseUtil.set_field_compulsory(self, key='log_obj', data=kwargs,
+ val=CACodeLog(**log_conf) if log_conf is not None else None)
+ ParseUtil.set_field_compulsory(self, key='serializer', data=kwargs, val=serializer)
# 移除name和msg键之后,剩下的就是对应的数据库字段
# 设置表名
# 是否关闭打印日志
- self.close_log = close_log
- self.__table_name__ = self.__table_name__
- self.operation = op_db.DbOperation()
- self.parse = op_db.parses()
- if not self.close_log:
- CACodeLog.log(_obj=self, msg='Being Initialize this object')
+ # self.__table_name__ = self.__table_name__
+ # self.operation = op_db.DbOperation()
# 模板类
- self.participants = participants
+ # self.instance = instance
# 该对象的所有字段
- fds = participants.to_dict()
- self.fields = list(fds.keys())
+ # fds = instance.fields
+ # self.fields = list(fds.keys())
# 配置类
- self.config_obj = config_obj
+ # self.config_obj = config_obj
# 操作数据库
- self.db_util = DbUtil.Db_opera(host=self.config_obj.host,
- port=self.config_obj.port,
- user=self.config_obj.user,
- password=self.config_obj.password,
- database=self.config_obj.database,
- charset=self.config_obj.charset)
- # 设定返回值
- self._result = None
-
+ # self.db_util = DbUtil.Db_opera(host=self.config_obj.host,
+ # port=self.config_obj.port,
+ # user=self.config_obj.user,
+ # password=self.config_obj.password,
+ # database=self.config_obj.database,
+ # charset=self.config_obj.charset)
# 配置日志
- self.log_obj = None
- if log_conf is not None:
- self.log_obj = LogObj(**log_conf)
+ # self.log_obj = None
+ # if log_conf is not None:
+ # self.log_obj = LogObj(**log_conf)
# 返回的结果
- self.result = None
+ # self.result = None
+ # 序列化器
+ # self.serializer = serializer
def conversion(self):
"""作者:CACode 最后编辑于2021/4/12
@@ -108,7 +158,18 @@ class Repository(object):
Return:
ORM转换之后的实体对象
"""
- return CACodePureORM(self)
+ return CACodePureORM(self, serializer=self.serializer)
+
+ def first(self):
+ """
+ 获取数据库中的第一个
+ """
+ self.conversion().top().end()
+
+ def last(self):
+ """
+ 获取最后一个参数
+ """
def find_all(self):
"""作者:CACode 最后编辑于2021/4/12
@@ -121,11 +182,18 @@ class Repository(object):
# 设置名称
name = str(uuid.uuid1())
# 开启任务
- kwargs = {'func': self.operation.__find_all__, '__task_uuid__': name, 't_local': self}
- self.result = self.operation.start(*self.fields, **kwargs)
+ kwargs = {
+ 'func': self.operation.__find_all__,
+ '__task_uuid__': name,
+ 't_local': self
+ }
+ result = self.operation.start(*self.fields, **kwargs)
+
+ self.result = self.serializer(instance=self.instance, base_data=result)
+
return self.result
- def find_by_field(self, *args):
+ def find_field(self, *args):
"""作者:CACode 最后编辑于2021/4/12
只查询指定名称的字段,如:
@@ -145,8 +213,9 @@ class Repository(object):
# 开启任务
kwargs = {'func': self.operation.__find_by_field__, '__task_uuid__': name, 't_local': self}
- self.result = self.operation.start(*args, **kwargs)
+ result = self.operation.start(*args, **kwargs)
+ self.result = self.serializer(instance=self.instance, base_data=result)
return self.result
def find_one(self, **kwargs):
@@ -160,18 +229,16 @@ class Repository(object):
code:
- _result = self.find_many(**kwargs)
- if len(_result) == 0:
+ result = self.find_many(**kwargs)
+ if len(result) == 0:
return None
else:
- return _result[0]
+ return result[0]
:param kwargs:包含所有参数:
pojo:参照对象
- last_id:是否需要返回最后一行数据,默认False
-
sql:处理过并加上%s的sql语句
params:需要填充的字段
@@ -187,8 +254,7 @@ class Repository(object):
return self.result[0]
def find_many(self, **kwargs):
- """作者:CACode 最后编辑于2021/4/12
-
+ """
查询出多行数据
第一个必须放置sql语句
@@ -197,8 +263,6 @@ class Repository(object):
pojo:参照对象
- last_id:是否需要返回最后一行数据,默认False
-
sql:处理过并加上%s的sql语句
params:需要填充的字段
@@ -214,17 +278,21 @@ class Repository(object):
kwargs['func'] = self.operation.__find_many__
kwargs['__task_uuid__'] = name
kwargs['t_local'] = self
- self.result = self.operation.start(**kwargs)
+ result = self.operation.start(**kwargs)
+
+ self.result = self.serializer(instance=self.instance, base_data=result)
return self.result
def find_sql(self, **kwargs):
"""
+
返回多个数据并用list包装:
+
- 可自动化操作
+
- 请尽量使用find_many(sql)操作
+
:param kwargs:包含所有参数:
- pojo:参照对象
- last_id:是否需要返回最后一行数据,默认False
sql:处理过并加上%s的sql语句
params:需要填充的字段
print_sql:是否打印sql语句
@@ -236,7 +304,9 @@ class Repository(object):
kwargs['func'] = self.operation.__find_sql__
kwargs['__task_uuid__'] = name
kwargs['t_local'] = self
- self.result = self.operation.start(**kwargs)
+ result = self.operation.start(**kwargs)
+
+ self.result = self.serializer(instance=self.instance, base_data=result)
return self.result
def update(self, **kwargs):
@@ -251,10 +321,10 @@ class Repository(object):
params:需要填充的字段
:return:
"""
- kwargs['config_obj'] = t_local.config_obj
- kwargs = self.parse.print_sql(**kwargs)
- kwargs = self.parse.last_id(**kwargs)
- return t_local.db_util.update(**kwargs)
+ kwargs['config_obj'] = self.config_obj
+ kwargs = self.ParseUtil.print_sql(**kwargs)
+ kwargs = self.ParseUtil.last_id(**kwargs)
+ return self.db_util.update(**kwargs)
def insert_sql(self, **kwargs):
"""
@@ -266,8 +336,8 @@ class Repository(object):
params:需要填充的字段
:return rowcount,last_id if last_id=True
"""
- kwargs = self.parse.print_sql(**kwargs)
- kwargs = self.parse.last_id(**kwargs)
+ kwargs = self.ParseUtil.print_sql(**kwargs)
+ kwargs = self.ParseUtil.last_id(**kwargs)
return self.db_util.insert(**kwargs)
def save(self, **kwargs):
@@ -275,53 +345,26 @@ class Repository(object):
将当前储存的值存入数据库
"""
kwargs['pojo'] = self
- return self.insert_one(**kwargs)
+ return self.create(**kwargs)
- def insert_one(self, **kwargs):
+ def create(self, **kwargs):
"""
插入属性:
返回受影响行数
:param kwargs:包含所有参数:
pojo:参照对象
last_id:是否需要返回最后一行数据,默认False
- params:需要填充的字段
:return:rowcount,last_id if last_id=True
"""
# 设置名称
name = str(uuid.uuid1())
# 开启任务
- kwargs['func'] = self.operation.__insert_one__
+ kwargs['func'] = self.operation.__insert__
kwargs['__task_uuid__'] = name
kwargs['t_local'] = self
self.result = self.operation.start(**kwargs)
return self.result
- def insert_many(self, **kwargs):
- """
- 插入多行
- 这个是用insert_one插入多行
- :param kwargs:包含所有参数:
- pojo_list:参照对象列表
- last_id:是否需要返回最后一行数据,默认False
- sql:处理过并加上%s的sql语句
- params:需要填充的字段
- :return:list[rowcount,last_id if last_id=True]
- """
- kwargs['config_obj'] = t_local.config_obj
- kwargs = self.parse.print_sql(**kwargs)
- kwargs = self.parse.last_id(**kwargs)
- t_local._result = []
- for item in kwargs['pojo_list']:
- kwargs['pojo'] = item
- t_local._result.append(self.insert_one(**kwargs))
- return t_local._result
-
- # def get_this(self):
- # """
- # 获取当前仓库
- # """
- # return self
-
def copy(self):
"""
复制对象进行操做
diff --git a/CACodeFramework/MainWork/__pycache__/Annotations.cpython-39.pyc b/CACodeFramework/MainWork/__pycache__/Annotations.cpython-39.pyc
deleted file mode 100644
index f8c58dfeae26ae8cd288a70af163dc1c38a14678..0000000000000000000000000000000000000000
Binary files a/CACodeFramework/MainWork/__pycache__/Annotations.cpython-39.pyc and /dev/null differ
diff --git a/CACodeFramework/MainWork/__pycache__/CACodePojo.cpython-39.pyc b/CACodeFramework/MainWork/__pycache__/CACodePojo.cpython-39.pyc
deleted file mode 100644
index 67d39a40abb877adc9e874b3813652affcb8815d..0000000000000000000000000000000000000000
Binary files a/CACodeFramework/MainWork/__pycache__/CACodePojo.cpython-39.pyc and /dev/null differ
diff --git a/CACodeFramework/MainWork/__pycache__/CACodePureORM.cpython-39.pyc b/CACodeFramework/MainWork/__pycache__/CACodePureORM.cpython-39.pyc
deleted file mode 100644
index 85963b53b56f0e106fc91e799f0914f2dda84f19..0000000000000000000000000000000000000000
Binary files a/CACodeFramework/MainWork/__pycache__/CACodePureORM.cpython-39.pyc and /dev/null differ
diff --git a/CACodeFramework/MainWork/__pycache__/CACodeRepository.cpython-39.pyc b/CACodeFramework/MainWork/__pycache__/CACodeRepository.cpython-39.pyc
deleted file mode 100644
index 6c5f6d5ee8ca3907f3d13315f3c766b03e158e58..0000000000000000000000000000000000000000
Binary files a/CACodeFramework/MainWork/__pycache__/CACodeRepository.cpython-39.pyc and /dev/null differ
diff --git a/CACodeFramework/MainWork/__pycache__/__init__.cpython-39.pyc b/CACodeFramework/MainWork/__pycache__/__init__.cpython-39.pyc
deleted file mode 100644
index 5c70e4f5f15a98629aa4c960d98cb2cbf49c3057..0000000000000000000000000000000000000000
Binary files a/CACodeFramework/MainWork/__pycache__/__init__.cpython-39.pyc and /dev/null differ
diff --git a/CACodeFramework/MainWork/exception/__pycache__/__init__.cpython-39.pyc b/CACodeFramework/MainWork/exception/__pycache__/__init__.cpython-39.pyc
deleted file mode 100644
index 5c21c0cdea6d85f7db1f3b09a11612f523499b8d..0000000000000000000000000000000000000000
Binary files a/CACodeFramework/MainWork/exception/__pycache__/__init__.cpython-39.pyc and /dev/null differ
diff --git a/CACodeFramework/MainWork/exception/__pycache__/e_except.cpython-39.pyc b/CACodeFramework/MainWork/exception/__pycache__/e_except.cpython-39.pyc
deleted file mode 100644
index ada947f55639221d46c2c7efd801b2a60f578755..0000000000000000000000000000000000000000
Binary files a/CACodeFramework/MainWork/exception/__pycache__/e_except.cpython-39.pyc and /dev/null differ
diff --git a/CACodeFramework/MainWork/exception/e_except.py b/CACodeFramework/MainWork/exception/e_except.py
deleted file mode 100644
index d76a1c846b109c8c671cd7f17597f51ee5aa6f80..0000000000000000000000000000000000000000
--- a/CACodeFramework/MainWork/exception/e_except.py
+++ /dev/null
@@ -1,41 +0,0 @@
-from datetime import datetime
-import warnings
-
-from CACodeFramework.field import e_fields
-
-
-def warn(obj, line, msg, f_warn, LogObject=None, task_name='\t\tMAIN'):
- """作者:CACode 最后编辑于2021/4/13
-
- 输出日志并返回日志内容
-
- 此方法不会中断程序运行
-
- 格式:
-
- 时间 类型 日志名称 对象地址 被调用行号 执行类型 信息
- 示例:
-
- line:234: Warning: 2021-04-13 08:24:08.169 WARN CACode-Database-Operation [1907116304800] [line:234] [2021-04-13 08:24:08.169] :INITIALIZE THIS OBJECT
- """
- t = datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]
- info = '{} {} {} [{}] [{}] [{}] \t\t\t:{}'.format(t, f_warn,
- e_fields.LOG_OPERA_NAME,
- id(obj),
- obj.__str__(),
- task_name,
- msg)
- # 输出日志信息
- warnings.warn_explicit(info, category=Warning, filename='line', lineno=line)
- if LogObject is not None:
- LogObject.warn(info)
- return info
-
-
-def error(cls, msg):
- """作者:CACode 最后编辑于2021/4/13
-
- 抛出异常并终止程序执行
- Atte
- """
- raise cls(msg)
diff --git a/CACodeFramework/MainWork/opera/__pycache__/__init__.cpython-39.pyc b/CACodeFramework/MainWork/opera/__pycache__/__init__.cpython-39.pyc
deleted file mode 100644
index 182160f084aff99160926d35493f7004b84dff6b..0000000000000000000000000000000000000000
Binary files a/CACodeFramework/MainWork/opera/__pycache__/__init__.cpython-39.pyc and /dev/null differ
diff --git a/CACodeFramework/MainWork/opera/__pycache__/obj_dict.cpython-39.pyc b/CACodeFramework/MainWork/opera/__pycache__/obj_dict.cpython-39.pyc
deleted file mode 100644
index 7475998d1dbe35583e3c538fb681aa6ac2e4e080..0000000000000000000000000000000000000000
Binary files a/CACodeFramework/MainWork/opera/__pycache__/obj_dict.cpython-39.pyc and /dev/null differ
diff --git a/CACodeFramework/MainWork/opera/__pycache__/op_db.cpython-39.pyc b/CACodeFramework/MainWork/opera/__pycache__/op_db.cpython-39.pyc
deleted file mode 100644
index 3344c3ad6be5eda086b00a7262216aa8f98fa62d..0000000000000000000000000000000000000000
Binary files a/CACodeFramework/MainWork/opera/__pycache__/op_db.cpython-39.pyc and /dev/null differ
diff --git a/CACodeFramework/MainWork/opera/obj_dict.py b/CACodeFramework/MainWork/opera/obj_dict.py
deleted file mode 100644
index 5d00ca8882472e1153e85528a4753e5a079f138f..0000000000000000000000000000000000000000
--- a/CACodeFramework/MainWork/opera/obj_dict.py
+++ /dev/null
@@ -1,111 +0,0 @@
-import copy
-import sys
-
-from CACodeFramework.MainWork.exception import e_except
-from CACodeFramework.field import e_fields
-from CACodeFramework.util.ParseUtil import ParseUtil
-
-
-class parses(object):
- def __init__(self, *args, **kwargs):
- self.args = args
- self.kwargs = kwargs
-
- def log(self, _obj, msg, name='\t\tTask', LogObject=None):
- """
- 输出任务执行日志
-
- :param _obj:任务对象的值
-
- """
- # 获得该函数被调用前的行号
- _l = sys._getframe().f_back.f_lineno
- # 格式:时间 类型 日志名称 对象地址 被调用行号 执行类型 信息
- info = e_except.warn(obj=_obj, line=_l, task_name=name, f_warn=e_fields.INFO, msg=msg, LogObject=LogObject)
-
- def last_id(self, **kwargs):
- """作者:CACode 最后编辑于2021/4/12
-
- 遵循规则:
-
- 内部>配置文件
-
- 是否包含返回最后一行ID的配置
-
- 只存在于更新操做的方法内,如:
-
- insert,
-
- update,
-
- delete
-
- Attributes:
-
- conf_obj:配置类
- """
- conf_obj = kwargs['config_obj']
- if 'last_id' not in kwargs.keys():
- if 'last_id' in conf_obj.conf.keys():
- kwargs['last_id'] = conf_obj.conf['last_id']
- else:
- kwargs['last_id'] = False
- return kwargs
-
- def print_sql(self, **kwargs):
- """
- 遵循规则:
- 内部>配置文件
-
- 是否包含打印sql的配置
-
- 存在于所有数据库操做
-
- Attributes:
- conf_obj:配置类
- """
- conf_obj = kwargs['config_obj']
- if 'print_sql' not in kwargs.keys():
- if 'print_sql' in conf_obj.conf.keys():
- kwargs['print_sql'] = conf_obj.conf['print_sql']
- else:
- kwargs['print_sql'] = False
- return kwargs
-
- def parse_insert(self, pojo, __table_name__):
- """
- 解析插入语句
-
- INSERT INTO `__table_name__`(`title`,'selects') VALUE ('','')
-
- :param pojo:POJO对象
- :param __table_name__:表名
- :return:
- """
- _dict = pojo.to_dict()
- # 得到所有的键
- keys = pojo.fields
- # 在得到值之后解析是否为空并删除为空的值和对应的字段
- cp_value = []
- values = [getattr(pojo, v) for v in keys]
- for i, j in enumerate(values):
- if j is None or pojo.eq_default(j):
- del keys[i]
- else:
- cp_value.append(j)
- return ParseUtil().parse_insert(keys, cp_value, __table_name__)
-
- def parse_obj(self, data: dict, participants):
- """
- 将数据解析成对象
- 注意事项:
- 数据来源必须是DbUtil下查询出来的
- :param data:单行数据
- :param participants:参与解析的对象
- :return:POJO对象
- """
- # 深度复制对象
- part_obj = copy.copy(participants)
- for key, value in data.items():
- setattr(part_obj, key, value)
- return part_obj
diff --git a/CACodeFramework/__pycache__/__init__.cpython-39.pyc b/CACodeFramework/__pycache__/__init__.cpython-39.pyc
deleted file mode 100644
index 4b3cc958dcf1b08eb490f01173a3b9ba80737d6d..0000000000000000000000000000000000000000
Binary files a/CACodeFramework/__pycache__/__init__.cpython-39.pyc and /dev/null differ
diff --git a/CACodeFramework/MainWork/exception/__init__.py b/CACodeFramework/anno/__init__.py
similarity index 100%
rename from CACodeFramework/MainWork/exception/__init__.py
rename to CACodeFramework/anno/__init__.py
diff --git a/CACodeFramework/anno/annos.py b/CACodeFramework/anno/annos.py
new file mode 100644
index 0000000000000000000000000000000000000000..1401ae638eeb1896613173afc4d8ee63fbae42f9
--- /dev/null
+++ b/CACodeFramework/anno/annos.py
@@ -0,0 +1,192 @@
+import re
+import inspect
+
+from CACodeFramework.anno.aop import AopModelObject
+from CACodeFramework.cacode.Serialize import QuerySet
+
+
+def Table(name, msg, **kwargs):
+ """
+ 标注该类为一个表
+ :param name:表的名称
+ :param msg:表的描述
+ :return:
+ """
+
+ def set_to_field(cls):
+ setattr(cls, '__table_name__', name)
+ setattr(cls, '__table_msg__', msg)
+ for key, value in kwargs.items():
+ setattr(cls, key, value)
+ return cls
+
+ return set_to_field
+
+
+def parse_kwargs(params, kwargs):
+ """
+ 通过${key}方式解析特殊字段
+ """
+ new_args = []
+ for i in params:
+ # 反选字符并替换
+ sub = re.sub(r'\${(.*?)}', '{}', str(i))
+ context = re.findall(r'\${(.*?)}', str(i))
+ if context:
+ mk = []
+ for con in context:
+ mk.append(kwargs[con])
+ # 将字符格式化进sub
+ sfm = sub.format(*mk)
+ new_args.append(sfm)
+
+ else:
+ new_args.append(i)
+
+ return new_args
+
+
+def Select(sql, params=None):
+ """
+ 快捷的查询装饰器
+
+ 使用此装饰器,可以将大量重复代码继承到此装饰器内部实现
+
+ 使用方法:
+ @Select(sql="SELECT * FROM demo_table WHERE t_id<=%s AND t_msg like %s", params=['${t_id}', '%${t_msg}%'])
+
+ sql:执行的sql语句,需要加密的参数使用`%s`表示
+
+ params:加密参数的内容,标记使用传参请使用`${字段名}`表示
+
+
+
+ """
+
+ def base_func(cls):
+ def _wrapper_(*args, **kwargs):
+ lines = list(args)
+ obj = lines[0]
+ del lines[0]
+ # cls_obj = cls(*lines, **kwargs)
+
+ new_args = parse_kwargs(params, kwargs)
+
+ result = obj.find_sql(sql=sql, params=new_args)
+
+ return QuerySet(obj, result)
+
+ return _wrapper_
+
+ return base_func
+
+
+def AopModel(before=None, after=None,
+ before_args=None, before_kwargs=None,
+ after_args=None, after_kwargs=None):
+ """
+
+ AOP切面模式:
+ 依赖AopModel装饰器,再在方法上加入@AopModel即可切入编程
+
+
+ 优点:
+
+ 当使用@AopModel时,内部函数将会逐级调用回调函数,执行循序是:
+ - func(*self.args, **self.kwargs)
+ - func(*self.args)
+ - func(**self.kwargs)
+ - func()
+ 这将意味着,如果你的参数传入错误时,AopModel依旧会遵循原始方法所使用的规则,最令人大跌眼镜的使用方法就是:
+
+ def Before(**kwargs):
+ print('Before:', kwargs)
+ # 此处的Before方法未存在args参数,而使用@AopModel时却传入了args
+ @AopModel(before=Before,before_args=(0,1,2), before_kwargs={'1': '1'})
+ def find_title_and_selects(self, **kwargs):
+
+ print('function task', kwargs['uid'])
+
+ _r = self.orm.find().where(index="<<100").end()
+
+ print(_r)
+
+ return _r
+
+ 其中包含参数有:
+ before:切入时需要执行的函数
+
+ before_args:切入的参数
+ 传入的列表或元组类型数据
+ 如果是需要使用当前pojo中的内容时,传参格式为:(pojo.字段名)
+ 可扩展格式,例如需要传入字典
+
+ before_kwargs:切入的参数 -- 传入的字典数据
+
+ after:切出前需要执行的参数
+
+ after_args:切出的参数
+ 传入的列表或元组类型数据
+ 如果是需要使用当前pojo中的内容时,传参格式为:('self.字段名')
+ 可扩展格式,例如需要传入字典:('self.dict.key')
+
+ after_kwargs:切出的参数 -- 传入的字典数据
+
+
+ 执行流程:
+
+ Before->original->After
+
+ Before注意事项:
+
+ 使用该参数时,方法具有返回值概不做处理,需要返回值内容可使用`global`定义一个全局字段用于保存数值
+
+ 当无法解析或者解析失败时m将使用pass关键字忽略操作
+
+ After注意事项:
+
+ 使用该参数时,必须搭配至少一个result=None的kwargs存在于方法的形参中,
+
+ 当original方法执行完成将把返回值固定使用result键值对注入到该函数中
+
+ 当无法解析或者解析失败时m将使用pass关键字忽略操作
+
+
+
+ Attributes:
+
+ before:切入时需要执行的函数
+
+ after:切出前需要执行的参数
+
+ before_args:切入的参数
+ 传入的列表或元组类型数据
+ 如果是需要使用当前pojo中的内容时,传参格式为:(pojo.字段名)
+ 可扩展格式,例如需要传入字典
+
+ before_kwargs:切入的参数 -- 传入的字典数据
+
+ after_args:切出的参数
+ 传入的列表或元组类型数据
+ 如果是需要使用当前pojo中的内容时,传参格式为:('self.字段名')
+ 可扩展格式,例如需要传入字典:('self.dict.key')
+
+ after_kwargs:切出的参数 -- 传入的字典数据
+
+
+ """
+ # 得到对象组
+ aop_obj = AopModelObject(before, after,
+ before_args, before_kwargs,
+ after_args, after_kwargs)
+
+ def base_func(func):
+ aop_obj.set_func(func)
+
+ def _wrapper_(*args, **kwargs):
+ aop_obj.set_args(*args, **kwargs)
+ return aop_obj.start()
+
+ return _wrapper_
+
+ return base_func
diff --git a/CACodeFramework/anno/aop.py b/CACodeFramework/anno/aop.py
new file mode 100644
index 0000000000000000000000000000000000000000..4394c0490acb916ec8677db6af18898a9ae8ab8a
--- /dev/null
+++ b/CACodeFramework/anno/aop.py
@@ -0,0 +1,247 @@
+import types
+
+from CACodeFramework.opera.CompulsoryRun import Compulsory
+
+
+class AopModelObject(object):
+ """
+ 此类为AopModel提供所有操作
+ """
+
+ def __init__(self, before=None, after=None,
+ before_args=None, before_kwargs=None,
+ after_args=None, after_kwargs=None):
+ # wraps(func)(self)
+ # self.func = func
+ # 初始化所有字段
+ self.__before_func__ = before
+ self.__before_args_data__ = before_args
+ self.__before_kwargs_data__ = before_kwargs
+
+ self.__after_func__ = after
+ self.__after_args_data__ = after_args
+ self.__after_kwargs_data__ = after_kwargs
+
+ def set_func(self, func):
+ self.func = func
+
+ def set_args(self, *args, **kwargs):
+ self.args = args
+ self.kwargs = kwargs
+
+ def start(self):
+ """
+ 主操作
+ """
+
+ # self.func = args[0]
+ self.init_fields()
+ # wraps(self.func)(self)
+ self.init_attr()
+
+ # 解析参数需要
+ # self.before_parse()
+ # 执行before操作
+ self.before_run()
+ # 执行原始数据
+ result = self.original_func()
+ # after解析
+ # self.after_parse(result)
+ # after操作
+ self.after_run(result)
+ # 返回原始数据
+ return result
+
+ def init_fields(self):
+ # 定义名称规则
+ self.after = 'after'
+ self.after_args = 'after_args'
+ self.after_kwargs = 'after_kwargs'
+
+ self.before = 'before'
+ self.before_args = 'before_args'
+ self.before_kwargs = 'before_kwargs'
+
+ self.__after__ = '__after_func__'
+ self.__after_args__ = '__after_args__'
+ self.__after_kwargs__ = '__after_kwargs__'
+
+ # 得到before参数的名称
+ self.__before_name__ = self.format_name(self.before)
+ self.__before_args_name__ = self.format_name(self.before_args)
+ self.__before_kwargs_name__ = self.format_name(self.before_kwargs)
+
+ # 得到after参数的名称
+
+ self.__after_name__ = self.format_name(self.__after__)
+ self.__after_args_name__ = self.format_name(self.__after_args__)
+ self.__after_kwargs_name__ = self.format_name(self.__after_kwargs__)
+
+ def __get__(self, instance, cls):
+ if instance is None:
+ return self
+ else:
+ return types.MethodType(self, instance)
+
+ def format_name(self, name):
+ """
+ 格式化名称字符串
+ """
+ return '{}{}'.format(name, self.func.__name__)
+
+ def setters(self, i1, i2, i3, k1, v1, k2, v2, k3, v3):
+ """
+ 批量设置
+ """
+ if i1 in self.__dict__.keys():
+ setattr(self, v1, self.__dict__[k1])
+ if i2 in self.__dict__.keys():
+ setattr(self, v2, self.__dict__[k2])
+ if i3 in self.__dict__.keys():
+ setattr(self, v3, self.__dict__[k3])
+
+ def init_attr(self):
+ """
+ 初始化cls下的字段
+ 通过使用setters下的setter()功能批量解析是否需要before或者after操作
+ """
+
+ self.setters(
+ i1=self.before,
+ i2=self.before_args,
+ i3=self.before_kwargs,
+ k1=self.before,
+ k2=self.before_args,
+ k3=self.before_kwargs,
+ v3=self.__before_kwargs_name__,
+ v1=self.__before_name__,
+ v2=self.__before_args_name__,
+ )
+
+ self.setters(
+ i1=self.after,
+ i2=self.after_args,
+ i3=self.after_kwargs,
+ k1=self.after,
+ k2=self.after_args,
+ k3=self.after_kwargs,
+ v1=self.__after_name__,
+ v2=self.__after_args_name__,
+ v3=self.__after_kwargs_name__
+ )
+
+ # def before_parse(self):
+ # """
+ # 解析before参数的方法需要什么参数类型
+ # """
+ # __before_func__ = None
+ # __before_args_data__ = None
+ # __before_kwargs_data__ = None
+ # # 如果包含切入函数的字段
+ # if hasattr(self, self.__before_name__):
+ # # 得到参数的名称
+ # __before_func__ = getattr(self, self.__before_name__)
+ # if hasattr(self, self.__before_args_name__) and hasattr(self, self.__before_kwargs_name__):
+ #
+ # __before_args_data__ = getattr(self, self.__before_args_name__)
+ # __before_kwargs_data__ = getattr(self, self.__before_kwargs_name__)
+ #
+ # elif hasattr(self, self.__before_args_name__):
+ # __before_args_data__ = getattr(self, self.__before_args_name__)
+ #
+ # elif hasattr(self, self.__before_kwargs_name__):
+ # __before_kwargs_data__ = getattr(self, self.__before_kwargs_name__)
+ #
+ # # 批添加方法、参数和键值对
+ # self.__before_func__ = __before_func__
+ # self.__before_args_data__ = __before_args_data__
+ # self.__before_kwargs_data__ = __before_kwargs_data__
+
+ def before_run(self):
+ """
+ 执行before方法
+ """
+ if self.__before_func__ and self.__before_args_data__ and self.__before_kwargs_data__:
+ self.__before_func__(*self.__before_args_data__, **self.__before_kwargs_data__)
+ elif self.__before_func__ and self.__before_args_data__:
+ self.__before_func__(*self.__before_args_data__)
+ elif self.__before_func__ and self.__before_kwargs_data__:
+ self.__before_func__(**self.__before_kwargs_data__)
+ elif self.__before_func__:
+ self.__before_func__()
+ else:
+ pass
+
+ # def after_parse(self, result):
+ # """
+ # 解析追加方法
+ # :param result:原始方法返回的值
+ # """
+ # __after_func__ = None
+ # __after_args_data__ = None
+ # __after_kwargs_data__ = {}
+ # # 如果包含切入函数的字段
+ # if hasattr(self, self.__after_name__):
+ # # 得到参数的名称
+ # __after_func__ = getattr(self, self.__after_name__)
+ # if hasattr(self, self.__after_args_name__) and hasattr(self, self.__after_kwargs_name__):
+ #
+ # __after_args_data__ = getattr(self, self.__after_args_name__)
+ # __after_kwargs_data__ = getattr(self, self.__after_kwargs_name__)
+ #
+ # elif hasattr(self, self.__after_args_name__):
+ # __after_args_data__ = getattr(self, self.__after_args_name__)
+ #
+ # elif hasattr(self, self.__after_kwargs_name__):
+ # __after_kwargs_data__ = getattr(self, self.__after_kwargs_name__)
+ #
+ # # 批添加方法、参数和键值对
+ # self.__after_func__ = __after_func__
+ # self.__after_args_data__ = __after_args_data__
+ # __after_kwargs_data__.update({'result': result})
+ # self.__after_kwargs_data__ = __after_kwargs_data__
+
+ def after_run(self, result):
+ """
+ 执行after方法
+ """
+ if self.__after_kwargs_data__ is None:
+ self.__after_kwargs_data__ = {}
+
+ self.__after_kwargs_data__.update({'result': result})
+ if self.__after_func__ and self.__after_args_data__ and self.__after_kwargs_data__:
+ self.__after_func__(*self.__after_args_data__, **self.__after_kwargs_data__)
+ elif self.__after_func__ and self.__after_args_data__:
+ self.__after_func__(*self.__after_args_data__)
+ elif self.__after_func__ and self.__after_kwargs_data__:
+ self.__after_func__(**self.__after_kwargs_data__)
+ elif self.__after_func__:
+ self.__after_func__()
+ else:
+ pass
+
+ def original_func(self):
+ """
+ 最后使用强制法返回函数执行的结果
+ 使用四个try逐一抛出
+ """
+ return Compulsory.run_function(func=self.func, args=self.args, kwargs=self.kwargs)
+ # try:
+ # return self.func(*self.args, **self.kwargs)
+ # except TypeError as e:
+ # pass
+ #
+ # try:
+ # return self.func(*self.args)
+ # except TypeError as e:
+ # pass
+ #
+ # try:
+ # return self.func(**self.kwargs)
+ # except TypeError as e:
+ # pass
+ #
+ # try:
+ # return self.func()
+ # except TypeError as e:
+ # pass
diff --git a/CACodeFramework/cache/__init__.py b/CACodeFramework/cache/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..d415e1d44ab6ccb233d5fa4989f938d97139a825
--- /dev/null
+++ b/CACodeFramework/cache/__init__.py
@@ -0,0 +1,5 @@
+# -*- utf-8 -*-
+# @Time: 2021/4/21 0:41
+# @Author: CACode
+# @File: __init__.py
+# @Software: PyCharm
diff --git a/CACodeFramework/cacode/Factory.py b/CACodeFramework/cacode/Factory.py
new file mode 100644
index 0000000000000000000000000000000000000000..664a8106ad0731a1c33f1a4ed95cc1e4eaa2eb6a
--- /dev/null
+++ b/CACodeFramework/cacode/Factory.py
@@ -0,0 +1,96 @@
+import threading
+
+from CACodeFramework.cacode import Modes
+from CACodeFramework.exception import e_fields
+from CACodeFramework.opera.CompulsoryRun import Compulsory
+from CACodeFramework.util.Log import CACodeLog
+import importlib
+
+
+class Factory(object):
+ """
+ 建造一个对象并将对象实例化
+
+ 使用方法:
+
+ class MyFactory(Factory):
+ def __init__(self):
+ self.instances = [
+ 'test.modules.Demo',
+ 'test.modules.BaseData',
+ ]
+ super().__init__()
+
+
+ if __name__ == '__main__':
+ ins = MyFactory.createInstance("Demo.DemoTable",kwargs={})
+ print(ins)
+ """
+ _instance_lock = threading.Lock()
+
+ def __init__(self, modules):
+ try:
+ self.modules = modules
+ except AttributeError:
+ CACodeLog.err(SyntaxError, e_fields.CACode_Factory_Error(
+ 'Please import the Pojo module first,请先设置导入modules模块'))
+
+ self.module_names = {}
+ self.__base_init__()
+
+ def __base_init__(self):
+ for package_name in self.modules:
+ base_module = str(package_name).split('.')
+ last_name = base_module[
+ (len(base_module) - 1) if
+ len(base_module) > 0 else
+ CACodeLog.err(TypeError,
+ e_fields.CACode_Factory_Error(
+ 'The module cannot be found, perhaps the `instances` are not set,'
+ '找不到模块,也许是未设置`instances`')
+ )
+ ]
+ # 将包导入
+ self.module_names[last_name] = package_name
+
+ @classmethod
+ def createInstance(cls, name: str, *args, **kwargs):
+ """
+ 建造一个对象并将对象实例化
+
+ 创建一个实例对象,并提供ORM操作
+
+ name使用包名最后一位置作为起始值,如:
+
+ Test.models.Demo
+
+ 那么,当你调用Demo下的model时,你必须使用`Demo.DemoTable`这种
+
+ 格式,因为包的引导使用的键是`.`(点)最后一位参数作为键
+
+
+
+ :param name:类的名称,从配置的instances开始获得
+ :param args:类的附属参数
+ :param kwargs:类的附属参数
+ """
+
+ # 使用单例模式初始化仓库
+ this = Modes.Singleton.createFactory(cls)
+
+ module_names = str(name).split('.')
+
+ # 断言这个module name不为空
+ assert len(module_names) > 0
+
+ first_module = module_names[0]
+
+ del module_names[0]
+
+ import_module = importlib.import_module(this.module_names[first_module])
+
+ result = Compulsory.search_target(import_module, module_names)
+
+ end_obj = Compulsory.run_function(func=result, args=args, kwargs=kwargs)
+
+ return end_obj
diff --git a/CACodeFramework/cacode/Modes.py b/CACodeFramework/cacode/Modes.py
new file mode 100644
index 0000000000000000000000000000000000000000..ce07bb8e300e559140c7bcea73be82bc2529d23b
--- /dev/null
+++ b/CACodeFramework/cacode/Modes.py
@@ -0,0 +1,313 @@
+# -*- coding: utf-8 -*- #
+# ------------------------------------------------------------------
+# File Name: Modes
+# Author: CACode
+# Version: 1.2
+# Created: 2021/4/27
+# Description: Main Function: 所有用到的设计模式
+# 此文件内保存可外置的设计模式,用于让那些脑瘫知道我写的框架用了什么设计模式而不是
+# 一遍一遍问我这框架都用了什么设计模式、体现在哪里,我叼你妈
+# Class List: Singleton -- 单例模式
+# Recursion -- 深度搜索树
+# History:
+#