Aestate
__init__.py
Go to the documentation of this file.
1 import copy
2 
3 from typing import List, Tuple
4 
5 from aestate.exception import FieldNotExist
6 from aestate.dbs._mysql import tag
7 from aestate.util import others
8 from aestate.util.Log import ALog
9 import threading
10 from aestate.work.Modes import Singleton
11 
12 
13 class ParseUtil:
14 
15  def parse_main(self, *args, to_str=False, symbol='%s', left='[', right=']', **kwargs):
16  """
17  解析属性:
18  将属性格式设置为:['`a`,','`b`,','`c`']
19  :param to_str:是否转成str格式
20  :param args:参数
21  :param is_field:是否为表字段格式
22  :param symbol:分隔符语法
23  :param left:分隔符语法
24  :param right:分隔符语法
25  :return:
26  """
27 
28  is_field = kwargs['is_field'] if 'is_field' in kwargs.keys() else False
29 
30  fields = []
31  for value in args:
32  value = others.conversion_types(value)
33  if to_str:
34  if is_field:
35  fields.append(f'{left}{symbol}{right},' % (str(value)))
36  else:
37  fields.append(f'{symbol},' % (str(value)))
38  else:
39  fields.append(value if not ParseUtil.is_default(value) else None)
40  if len(fields) != 0:
41  fields[len(fields) - 1] = fields[len(fields) - 1].replace(',', '')
42  field_str = ''
43  if to_str:
44  for field in fields:
45  field_str += field
46  return field_str
47  return fields
48  else:
49  return None
50 
51  def parse_key(self, *args, **kwargs):
52  """
53  解析键格式,如:
54  INSERT INTO `demo` (这里的就是键) VALUES ('','','','');
55  :param args:
56  :return:
57  """
58  if 'is_field' not in kwargs.keys():
59  kwargs['is_field'] = True
60  fields = self.parse_main(*args, to_str=True, **kwargs)
61  return fields
62 
63  def parse_value(self, *args, **kwargs):
64  """
65  解析值格式,如:
66  INSERT INTO `demo` (`index`, `title`, `selects`, `success`) VALUES (这里的就是值);
67  :param args:
68  :return:
69  """
70  values = self.parse_main(*args, **kwargs)
71  return values
72 
73  def parse_insert(self, keys, values, __table_name__, insert_str, values_str, symbol='%s',
74  sql_format='%s %s (%s)%s(%s)'):
75  """
76  实现此方法可自定义sql生成模式
77 
78  keys:包含了所有需要解析的字段名
79  values:包含了所有需要用到的字段的值
80  __table_name__:表名称
81  insert_str:insert的字符串
82  values_str:values字符串
83  symbol:格式化方式,以`%s`作为匿名符号
84  """
85  fields = self.parse_key(*keys)
86  values = self.parse_value(*values)
87  # 分析需要几个隐藏值
88  hides_value = [f'{symbol},' for i in range(len(values))]
89  # 去除末尾的逗号
90  end = hides_value[len(hides_value) - 1]
91  hides_value[len(hides_value) - 1] = end[0: len(end) - 1]
92  # 得到最后隐藏符号的字符串表达格式
93  value = ''.join(hides_value)
94  sql = sql_format % (
95  insert_str,
96  str(__table_name__), fields, values_str, value
97  )
98 
99  kes = {'sql': sql}
100  args = []
101  [args.append(i) for i in values]
102  kes['params'] = args
103  return kes
104 
105  def parse_insert_pojo(self, pojo, __table_name__, insert_str, values_str):
106  """
107  解析插入语句
108 
109  INSERT INTO `__table_name__`(`title`,'selects') VALUE ('','')
110 
111  :param pojo:POJO对象
112  :param __table_name__:表名
113  :param insert_str:insert的sql方言
114  :param values_str:values的sql方言
115  :return:
116  """
117  # 得到所有的键
118  ParseUtil.fieldExist(pojo, 'fields', raise_exception=True)
119  # 在得到值之后解析是否为空并删除为空的值和对应的字段
120  cp_value = []
121  # 复制新的一张字段信息
122  keys_copy = []
123 
124  keys_c, cp_v = ParseUtil.parse_pojo(pojo)
125  keys_copy += keys_c
126  cp_value += cp_v
127 
128  return self.parse_insert(keys_copy, cp_value, __table_name__, insert_str=insert_str,
129  values_str=values_str)
130 
131  @staticmethod
132  def parse_pojo(pojo) -> Tuple[list, list]:
133  keys = pojo.fields
134  # 在得到值之后解析是否为空并删除为空的值和对应的字段
135  cp_value = []
136  # 复制新的一张字段信息
137  keys_copy = []
138  values = [getattr(pojo, v) for v in keys]
139  for i, j in enumerate(values):
140  if j is not None and not ParseUtil.is_default(j):
141  keys_copy.append(keys[i])
142  cp_value.append(j)
143 
144  return keys_copy, cp_value
145 
146  @staticmethod
147  def parse_obj(data: dict, instance: object) -> object:
148  """
149  将数据解析成对象
150  注意事项:
151  数据来源必须是DbUtil下查询出来的
152  :param data:单行数据
153  :param instance:参与解析的对象
154  :return:POJO对象
155  """
156  # 深度复制对象
157  part_obj = copy.copy(instance)
158  for key, value in data.items():
159  setattr(part_obj, key, value)
160  return part_obj
161 
162  @staticmethod
163  def find_last_id(**kwargs):
164  """作者:CACode 最后编辑于2021/4/12
165 
166  遵循规则:
167 
168  内部>配置文件
169 
170  是否包含返回最后一行ID的配置
171 
172  只存在于更新操做的方法内,如:
173 
174  insert,
175 
176  update,
177 
178  delete
179 
180  Attributes:
181 
182  conf_obj:配置类
183  """
184  conf_obj = kwargs['config_obj']
185  if 'last_id' not in kwargs.keys():
186  c_dict = conf_obj.get_dict()
187  if 'last_id' in c_dict.keys():
188  kwargs['last_id'] = c_dict['last_id']
189  else:
190  kwargs['last_id'] = False
191  return kwargs
192 
193  @staticmethod
194  def find_print_sql(**kwargs):
195  """
196  遵循规则:
197  内部>配置文件
198 
199  是否包含打印sql的配置
200 
201  存在于所有数据库操做
202 
203  Attributes:
204  conf_obj:配置类
205  """
206  conf_obj = kwargs['config_obj']
207  if 'print_sql' not in kwargs.keys():
208  c_dict = conf_obj.get_dict()
209  if 'print_sql' in c_dict.keys():
210  kwargs['print_sql'] = c_dict['print_sql']
211  else:
212  kwargs['print_sql'] = False
213  return kwargs
214 
215  @staticmethod
216  def case_name(text, rep_text='_', lower=True, upper=False):
217  """
218  将驼峰文本改为使用指定符号分割的字符串表达形式并全部小写
219  :param text:需要替换的文本
220  :param rep_text:在大写文本后面追加的字符串
221  :param lower:是否需要全部小写
222  :param upper:是否需要全部大写
223  """
224  lst = []
225  for index, char in enumerate(text):
226  if char.isupper() and index != 0:
227  lst.append(rep_text)
228  lst.append(char)
229  # 替换名称
230  if lower:
231  return "".join(lst).lower()
232  elif upper:
233  return "".join(lst).upper()
234  else:
235  return "".join(lst)
236 
237  @staticmethod
238  def is_default(__val):
239  """
240  是否等于默认值
241  """
242  try:
243  t_v = __val.__class__.__base__
244  if t_v in [tag.Template, tag.baseTag]:
245  return __val.default is None
246  except SyntaxError:
247  return False
248 
249  @staticmethod
250  def set_field(obj, key, value):
251  """
252  当对象没有这个字段时,为对象设置一个字段
253 
254  为了方便提高拓展性可解耦,框架内部务必使用此
255 
256  方法或者set_field_compulsory()为操作管理类提供对象
257 
258  """
259  if not hasattr(obj, key):
260  setattr(obj, key, value)
261 
262  @staticmethod
263  def set_field_compulsory(obj, key: str, data: dict, val: object) -> None:
264  """
265  如果键存在于data中,为obj插入该值,反之插入val
266  """
267  if key in data.keys():
268  setattr(obj, key, data[key])
269  else:
270  setattr(obj, key, val)
271 
272  @staticmethod
273  def fieldExist(obj: object, field: str, el=None, raise_exception=False) -> object:
274  """
275  在对象中获取一个字段的值,如果这个字段不存在,则将值设置为`el`
276  """
277  if isinstance(obj, dict):
278  if field in obj.keys():
279  return obj[field]
280  else:
281  if raise_exception:
282  ALog.log_error(
283  msg=f'the key of `{field}` cannot be found in the `{obj.__class__.__name__}`',
284  obj=FieldNotExist, raise_exception=True)
285  else:
286  return el
287  else:
288  if hasattr(obj, field):
289  return getattr(obj, field)
290  else:
291  if raise_exception:
292  raise ALog.log_error(
293  msg=f'the key of `{field}` cannot be found in the `{obj.__class__.__name__}`',
294  obj=FieldNotExist,
295  raise_exception=True)
296  else:
297  return el
298 
299  @staticmethod
300  def parse_pojo_many(pojo_many: list) -> List[tuple]:
301 
302  # 在得到值之后解析是否为空并删除为空的值和对应的字段
303  cp_value = []
304  for pojo in pojo_many:
305  keys_c, cp_v = ParseUtil.parse_pojo(pojo)
306  cp_value.append(tuple(cp_v))
307  # 真实值
308  return cp_value
309 
310  @staticmethod
311  def insert_to_obj(obj, kwargs):
312  for key, value in kwargs.items():
313  ParseUtil.set_field_compulsory(obj=obj, key=key, data=kwargs, val=value)
314 
315  def get_pojo_sql(self, instance):
316  """
317  获取创建pojo对象的sql语句
318  """
319  fields = instance.getFields()
320  print(fields)
321 
322 
323 # 所有常量以空格开头并且以空格结束
324 # 空格符
325 class Fields:
326  """
327  默认的数据库方言配置
328  """
329 
330  _instance_lock = threading.RLock()
331 
332  @staticmethod
333  def parse_field(key: str) -> str:
334  return f' {key} '
335 
336  @property
337  def left_subscript(self):
338  """
339  左角标
340  """
341  return '`'
342 
343  @property
344  def space(self):
345  """
346  空格
347  """
348  return ' '
349 
350  @property
351  def right_subscript(self):
352  """
353  右角标
354  """
355  return '`'
356 
357  @property
358  def insert_str(self):
359  """
360  插入
361  """
362  return self.parse_field('INSERT INTO')
363 
364  @property
365  def delete_str(self):
366  """
367  删除
368  """
369  return self.parse_field('DELETE')
370 
371  @property
372  def update_str(self):
373  """
374  更新
375  """
376  return self.parse_field('UPDATE')
377 
378  @property
379  def find_str(self):
380  return self.parse_field('SELECT')
381 
382  @property
383  def where_str(self):
384  return self.parse_field('WHERE')
385 
386  @property
387  def by_str(self):
388  return self.parse_field('BY')
389 
390  @property
391  def order_by_str(self):
392  return self.parse_field('ORDER BY')
393 
394  @property
395  def group_by_str(self):
396  return self.parse_field('GROUP BY')
397 
398  @property
399  def desc_str(self):
400  return self.parse_field('DESC')
401 
402  @property
403  def set_str(self):
404  return self.parse_field('SET')
405 
406  @property
407  def ander_str(self):
408  return self.parse_field('AND')
409 
410  @property
411  def limit_str(self):
412  return self.parse_field('LIMIT')
413 
414  @property
415  def from_str(self):
416  return self.parse_field('FROM')
417 
418  @property
419  def value_str(self):
420  return self.parse_field('VALUE')
421 
422  @property
423  def values_str(self):
424  return self.parse_field('VALUES')
425 
426  @property
427  def asses_str(self):
428  return self.parse_field('AS')
429 
430  @property
431  def left_par(self):
432  return self.parse_field('(')
433 
434  @property
435  def right_par(self):
436  return self.parse_field(')')
437 
438  @property
439  def comma(self):
440  return self.parse_field(',')
441 
442  @property
443  def eq(self):
444  return self.parse_field('=')
445 
446  @property
447  def on_str(self):
448  return self.parse_field('on')
449 
450  @property
451  def left_join_str(self):
452  return self.parse_field('LEFT JOIN')
453 
454  @property
455  def symbol(self):
456  return '>> << == <= >= != - + / * %'.split(' ')
457 
458  def parse_set(self, keys):
459  """
460  格式化set键
461  """
462  keys_str = ''
463  for i in keys:
464  keys_str += '{}=%s{}'.format(i, self.ander_str)
465  keys_str = keys_str[0:len(keys_str) - len(self.ander_str)]
466  return keys_str
467 
468  def __new__(cls, *args, **kwargs):
469  instance = Singleton.createObject(cls)
470  return instance
471 
472 
473 class OperaBase:
474  def __init__(self, instance, fields):
475  self.instance = instance
476  self.fields = fields
477 
478  def start(self):
479  pass
480 
481 
482 class CreateModel(OperaBase):
483  """
484  将pojo创建为数据库的表
485  """
486 
487  def start(self):
488  __table_name__ = self.instance.__table_name__
489 
490 
492  def start(self):
493  pass
aestate.dbs._mssql.Fields.from_str
def from_str(self)
Definition: __init__.py:415
aestate.dbs._mssql.Fields.on_str
def on_str(self)
Definition: __init__.py:447
aestate.dbs._mssql.ParseUtil.get_pojo_sql
def get_pojo_sql(self, instance)
Definition: __init__.py:315
aestate.dbs._mssql.OperaBase.start
def start(self)
Definition: __init__.py:478
aestate.dbs._mssql.Fields.set_str
def set_str(self)
Definition: __init__.py:403
aestate.dbs._mssql.ParseUtil.parse_value
def parse_value(self, *args, **kwargs)
Definition: __init__.py:63
aestate.dbs._mssql.Fields.asses_str
def asses_str(self)
Definition: __init__.py:427
aestate.dbs._mssql.Fields.values_str
def values_str(self)
Definition: __init__.py:423
aestate.dbs._mssql.ParseUtil.find_last_id
def find_last_id(**kwargs)
Definition: __init__.py:163
aestate.dbs._mssql.Fields.eq
def eq(self)
Definition: __init__.py:443
aestate.dbs._mssql.ParseUtil.set_field
def set_field(obj, key, value)
Definition: __init__.py:250
aestate.dbs._mssql.Fields.ander_str
def ander_str(self)
Definition: __init__.py:407
aestate.dbs._mssql.ParseUtil.parse_key
def parse_key(self, *args, **kwargs)
Definition: __init__.py:51
aestate.dbs._mssql.ParseUtil.insert_to_obj
def insert_to_obj(obj, kwargs)
Definition: __init__.py:311
aestate.dbs._mssql.Fields.parse_set
def parse_set(self, keys)
Definition: __init__.py:458
aestate.dbs._mssql.Fields.value_str
def value_str(self)
Definition: __init__.py:419
aestate.dbs._mssql.ParseUtil.is_default
def is_default(__val)
Definition: __init__.py:238
aestate.dbs._mssql.Fields.where_str
def where_str(self)
Definition: __init__.py:383
aestate.dbs._mysql
Definition: __init__.py:1
aestate.dbs._mssql.Fields.by_str
def by_str(self)
Definition: __init__.py:387
aestate.dbs._mssql.Fields.__new__
def __new__(cls, *args, **kwargs)
Definition: __init__.py:468
aestate.dbs._mssql.Fields.comma
def comma(self)
Definition: __init__.py:439
aestate.dbs._mssql.ParseUtil.parse_obj
object parse_obj(dict data, object instance)
Definition: __init__.py:147
aestate.dbs._mssql.ParseUtil.fieldExist
object fieldExist(object obj, str field, el=None, raise_exception=False)
Definition: __init__.py:273
aestate.dbs._mssql.Fields.left_subscript
def left_subscript(self)
Definition: __init__.py:337
aestate.dbs._mssql.Fields.delete_str
def delete_str(self)
Definition: __init__.py:365
aestate.dbs._mssql.Fields.update_str
def update_str(self)
Definition: __init__.py:372
aestate.dbs._mssql.Fields.insert_str
def insert_str(self)
Definition: __init__.py:358
aestate.dbs._mssql.ParseUtil.case_name
def case_name(text, rep_text='_', lower=True, upper=False)
Definition: __init__.py:216
aestate.dbs._mssql.Fields.left_par
def left_par(self)
Definition: __init__.py:431
aestate.dbs._mssql.OperaBase.instance
instance
Definition: __init__.py:475
aestate.dbs._mssql.Fields.right_subscript
def right_subscript(self)
Definition: __init__.py:351
aestate.dbs._mssql.MakeModel.start
def start(self)
Definition: __init__.py:492
aestate.dbs._mssql.MakeModel
Definition: __init__.py:491
aestate.dbs._mssql.Fields.find_str
def find_str(self)
Definition: __init__.py:379
aestate.dbs._mssql.Fields.order_by_str
def order_by_str(self)
Definition: __init__.py:391
aestate.dbs._mssql.CreateModel.start
def start(self)
Definition: __init__.py:487
aestate.dbs._mssql.ParseUtil.find_print_sql
def find_print_sql(**kwargs)
Definition: __init__.py:194
aestate.util
Definition: __init__.py:1
aestate.util.Log
Definition: Log.py:1
aestate.dbs._mssql.Fields.left_join_str
def left_join_str(self)
Definition: __init__.py:451
aestate.work.Modes
Definition: Modes.py:1
aestate.exception
Definition: __init__.py:1
aestate.dbs._mssql.ParseUtil.parse_pojo
Tuple[list, list] parse_pojo(pojo)
Definition: __init__.py:132
aestate.dbs._mssql.ParseUtil.parse_insert
def parse_insert(self, keys, values, __table_name__, insert_str, values_str, symbol='%s', sql_format='%s %s(%s)%s(%s)')
Definition: __init__.py:73
aestate.dbs._mssql.Fields.symbol
def symbol(self)
Definition: __init__.py:455
aestate.dbs._mssql.OperaBase.fields
fields
Definition: __init__.py:476
aestate.dbs._mssql.Fields.space
def space(self)
Definition: __init__.py:344
aestate.dbs._mssql.Fields.group_by_str
def group_by_str(self)
Definition: __init__.py:395
aestate.dbs._mssql.ParseUtil.parse_insert_pojo
def parse_insert_pojo(self, pojo, __table_name__, insert_str, values_str)
Definition: __init__.py:105
aestate.dbs._mssql.Fields
Definition: __init__.py:325
aestate.dbs._mssql.Fields.limit_str
def limit_str(self)
Definition: __init__.py:411
aestate.dbs._mssql.ParseUtil
Definition: __init__.py:13
aestate.dbs._mssql.Fields.desc_str
def desc_str(self)
Definition: __init__.py:399
aestate.dbs._mssql.ParseUtil.set_field_compulsory
None set_field_compulsory(obj, str key, dict data, object val)
Definition: __init__.py:263
aestate.dbs._mssql.ParseUtil.parse_pojo_many
List[tuple] parse_pojo_many(list pojo_many)
Definition: __init__.py:300
aestate.dbs._mssql.Fields.right_par
def right_par(self)
Definition: __init__.py:435
aestate.dbs._mssql.OperaBase.__init__
def __init__(self, instance, fields)
Definition: __init__.py:474
aestate.dbs._mssql.OperaBase
Definition: __init__.py:473
aestate.dbs._mssql.ParseUtil.parse_main
def parse_main(self, *args, to_str=False, symbol='%s', left='[', right=']', **kwargs)
Definition: __init__.py:15
aestate.dbs._mssql.Fields.parse_field
str parse_field(str key)
Definition: __init__.py:333