kcwebs 1.87__tar.gz → 1.89__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. {kcwebs-1.87 → kcwebs-1.89}/PKG-INFO +2 -2
  2. {kcwebs-1.87 → kcwebs-1.89}/kcwebs/__init__.py +1 -1
  3. {kcwebs-1.87 → kcwebs-1.89}/kcwebs/common/autoload.py +14 -20
  4. {kcwebs-1.87 → kcwebs-1.89}/kcwebs/utill/db/mongodb.py +2 -1
  5. {kcwebs-1.87 → kcwebs-1.89}/kcwebs.egg-info/PKG-INFO +2 -2
  6. {kcwebs-1.87 → kcwebs-1.89}/kcwebs.egg-info/SOURCES.txt +1 -3
  7. {kcwebs-1.87 → kcwebs-1.89}/kcwebs.egg-info/requires.txt +4 -3
  8. {kcwebs-1.87 → kcwebs-1.89}/setup.py +1 -1
  9. kcwebs-1.87/kcwebs/utill/db/sqlite.py +0 -684
  10. {kcwebs-1.87 → kcwebs-1.89}/README.md +0 -0
  11. {kcwebs-1.87 → kcwebs-1.89}/kcwebs/common/__init__.py +0 -0
  12. {kcwebs-1.87 → kcwebs-1.89}/kcwebs/common/session.py +0 -0
  13. {kcwebs-1.87 → kcwebs-1.89}/kcwebs/config/__init__.py +0 -0
  14. {kcwebs-1.87 → kcwebs-1.89}/kcwebs/kcwebs.py +0 -0
  15. {kcwebs-1.87 → kcwebs-1.89}/kcwebs/tempfile/kcwebs/app/__init__.py +0 -0
  16. {kcwebs-1.87 → kcwebs-1.89}/kcwebs/tempfile/kcwebs/app/api/__init__.py +0 -0
  17. {kcwebs-1.87 → kcwebs-1.89}/kcwebs/tempfile/kcwebs/app/api/common/__init__.py +0 -0
  18. {kcwebs-1.87 → kcwebs-1.89}/kcwebs/tempfile/kcwebs/app/api/common/autoload.py +0 -0
  19. {kcwebs-1.87 → kcwebs-1.89}/kcwebs/tempfile/kcwebs/app/api/controller/__init__.py +0 -0
  20. {kcwebs-1.87 → kcwebs-1.89}/kcwebs/tempfile/kcwebs/app/api/controller/index/__init__.py +0 -0
  21. {kcwebs-1.87 → kcwebs-1.89}/kcwebs/tempfile/kcwebs/app/api/controller/index/common/__init__.py +0 -0
  22. {kcwebs-1.87 → kcwebs-1.89}/kcwebs/tempfile/kcwebs/app/api/controller/index/common/autoload.py +0 -0
  23. {kcwebs-1.87 → kcwebs-1.89}/kcwebs/tempfile/kcwebs/app/api/controller/index/common/html/include/static.html +0 -0
  24. {kcwebs-1.87 → kcwebs-1.89}/kcwebs/tempfile/kcwebs/app/api/controller/index/common/model.py +0 -0
  25. {kcwebs-1.87 → kcwebs-1.89}/kcwebs/tempfile/kcwebs/app/api/controller/index/index.py +0 -0
  26. {kcwebs-1.87 → kcwebs-1.89}/kcwebs/tempfile/kcwebs/app/api/controller/index/tpl/index/home.html +0 -0
  27. {kcwebs-1.87 → kcwebs-1.89}/kcwebs/tempfile/kcwebs/app/api/controller/index/tpl/index/index.html +0 -0
  28. {kcwebs-1.87 → kcwebs-1.89}/kcwebs/tempfile/kcwebs/app/common/__init__.py +0 -0
  29. {kcwebs-1.87 → kcwebs-1.89}/kcwebs/tempfile/kcwebs/app/common/autoload.py +0 -0
  30. {kcwebs-1.87 → kcwebs-1.89}/kcwebs/tempfile/kcwebs/app/common/html/include/static.html +0 -0
  31. {kcwebs-1.87 → kcwebs-1.89}/kcwebs/tempfile/kcwebs/app/common/model.py +0 -0
  32. {kcwebs-1.87 → kcwebs-1.89}/kcwebs/tempfile/kcwebs/app/config/__init__.py +0 -0
  33. {kcwebs-1.87 → kcwebs-1.89}/kcwebs/tempfile/kcwebs/app/config/app.py +0 -0
  34. {kcwebs-1.87 → kcwebs-1.89}/kcwebs/tempfile/kcwebs/app/config/database.py +0 -0
  35. {kcwebs-1.87 → kcwebs-1.89}/kcwebs/tempfile/kcwebs/app/config/other.py +0 -0
  36. {kcwebs-1.87 → kcwebs-1.89}/kcwebs/tempfile/kcwebs/app/config/redis.py +0 -0
  37. {kcwebs-1.87 → kcwebs-1.89}/kcwebs/tempfile/kcwebs/server.py +0 -0
  38. {kcwebs-1.87 → kcwebs-1.89}/kcwebs/utill/db/model.py +0 -0
  39. {kcwebs-1.87 → kcwebs-1.89}/kcwebs/utill/queues.py +0 -0
  40. {kcwebs-1.87 → kcwebs-1.89}/kcwebs.egg-info/dependency_links.txt +0 -0
  41. {kcwebs-1.87 → kcwebs-1.89}/kcwebs.egg-info/entry_points.txt +0 -0
  42. {kcwebs-1.87 → kcwebs-1.89}/kcwebs.egg-info/top_level.txt +0 -0
  43. {kcwebs-1.87 → kcwebs-1.89}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 1.2
2
2
  Name: kcwebs
3
- Version: 1.87
3
+ Version: 1.89
4
4
  Summary: kcwebs作为web开发而设计的高性能框架
5
5
  Home-page: https://docs.kwebapp.cn/index/index/2
6
6
  Author: 百里-坤坤
@@ -9,5 +9,5 @@ Maintainer: 坤坤
9
9
  Maintainer-email: fk1402936534@qq.com
10
10
  License: MIT License
11
11
  Description: kcwebs作为web开发而设计的高性能框架,采用全新的架构思想,注重易用性。遵循MIT开源许可协议发布,意味着个人和企业可以免费使用kcwebs,甚至允许把你基于kcwebs开发的应用开源或商业产品发布或销售。完整文档请访问:https://docs.kwebapp.cn/index/index/2
12
- Keywords: kcwebs1.87
12
+ Keywords: kcwebs1.89
13
13
  Platform: UNKNOWN
@@ -1,5 +1,5 @@
1
1
  # -*- coding: utf-8 -*-
2
- __version__ = '1.87'
2
+ __version__ = '1.89'
3
3
 
4
4
  kcwebsinfo={}
5
5
  kcwebsinfo['name']='kcwebs' #项目的名称
@@ -1,22 +1,11 @@
1
1
  from kcws.common import *
2
2
  from .. import config
3
- import random,urllib,asyncio,websockets,smtplib,datetime,chardet,copy,multiprocessing,threading
3
+ import random,urllib,asyncio,websockets,smtplib,datetime,chardet,copy
4
4
  import kcwredis,kcwcache,kcwmysql
5
- from email.mime.text import MIMEText
6
- from email.utils import formataddr
7
- from mako.template import Template as kcwsTemplate
8
- from mako.lookup import TemplateLookup
9
- from kcwebs.utill.db import sqlite as kcwssqlite
10
5
  from kcwebs.utill.db import mongodb as kcwsmongodb
11
- from dateutil.relativedelta import relativedelta
12
- # from kcwebs.utill.http import Http
13
6
  from kcwhttp.httpclass import Http
14
7
  from kcwebs.utill.queues import Queues
15
8
  from kcwebs.utill.db import model
16
-
17
-
18
-
19
-
20
9
  redisobj=kcwredis.redis
21
10
  python_version=platform.python_version()
22
11
  if python_version[0:3]!='3.8':
@@ -291,7 +280,7 @@ class kcwebssocket:
291
280
  # def start():
292
281
  # kwebsocket=kcwebssocket()
293
282
  # kwebsocket.start()
294
-
283
+ def before_request():pass
295
284
  def timestampToDate(times,format="%Y-%m-%d %H:%M:%S"):
296
285
  """时间戳转换时间
297
286
 
@@ -314,6 +303,9 @@ def send_mail(user,text="邮件内容",theme="邮件主题",recNick="收件人
314
303
 
315
304
  return Boolean类型
316
305
  """
306
+ from email.mime.text import MIMEText
307
+ from email.utils import formataddr
308
+
317
309
  ret=True
318
310
  if not theme:
319
311
  theme=config.email['theme']
@@ -337,12 +329,9 @@ def Template(path,**context):
337
329
  return Templates(path,**context)
338
330
  def Templates(path,**context):
339
331
  "模板渲染引擎函数,需要完整的模板目录文件"
332
+ from mako.template import Template as kcwsTemplate
333
+ from mako.lookup import TemplateLookup
340
334
  lookup = TemplateLookup(directories=[''])
341
- # body=''
342
- # with open(path, 'r',encoding='utf-8') as f:
343
- # contents=f.read()
344
- # t=kcwsTemplate(contents,lookup=lookup,module_directory=config.cache['path']+"/Template")
345
- # body=t.render(**context)
346
335
  if (path[:1]=="/" or path[1:2]==":") and ('.html' in path or '.shtml' in path or '.htm' in path):
347
336
  t=kcwsTemplate(filename=path,module_directory=config.cache['path']+"/Template",lookup=lookup)
348
337
  else:
@@ -351,6 +340,8 @@ def Templates(path,**context):
351
340
  return body
352
341
  def kcwsTemp(contents,**context):
353
342
  "模板渲染引擎函数,传字符串进来"
343
+ from mako.template import Template as kcwsTemplate
344
+ from mako.lookup import TemplateLookup
354
345
  lookup = TemplateLookup(directories=[''])
355
346
  t=kcwsTemplate(contents,lookup=lookup,module_directory=config.cache['path']+"/Template")
356
347
  body=t.render(**context)
@@ -390,7 +381,8 @@ def sqlite(table=None,configss=None):
390
381
 
391
382
  参数 configss 数据库配置 可以传数据库名字符串
392
383
  """
393
- dbs=kcwssqlite.sqlite()
384
+ import kcwsqlite
385
+ dbs=kcwsqlite.sqlite #kcwssqlite.sqlite()
394
386
  if table is None:
395
387
  return dbs
396
388
  elif configss:
@@ -471,6 +463,7 @@ def dateoperator(date,years=0,formats='%Y%m%d%H%M%S',months=0, days=0, hours=0,
471
463
 
472
464
  return %Y%m%d%H%M%S
473
465
  """
466
+ from dateutil.relativedelta import relativedelta
474
467
  formatss='%Y%m%d%H%M%S'
475
468
  date=re.sub('[-年/月::日 时分秒]','',date)
476
469
  if len(date) < 8:
@@ -495,7 +488,7 @@ def get_kcwebs_folder():
495
488
  if not os.path.exists(get_kcwebs_folder()+"/pid/"):
496
489
  os.makedirs(get_kcwebs_folder()+"/pid/", exist_ok=True)
497
490
  def kill_all_kcwebs_pid(types='all'):
498
- """结束kcwebps框架的所有子进程
491
+ """结束kcwebs框架的所有子进程
499
492
 
500
493
  types 可选 all 和 kcwebs
501
494
  """
@@ -757,6 +750,7 @@ class response:
757
750
 
758
751
  ETag 缓存标识
759
752
  """
753
+ import filetype
760
754
  status='200 ok'
761
755
  header={"Cache-Control":"public, max-age=2592000"}
762
756
  if isinstance(body,str):
@@ -1,5 +1,5 @@
1
1
  # -*- coding: utf-8 -*-
2
- import pymongo,re
2
+ import re
3
3
  from bson.objectid import ObjectId
4
4
  from kcwebs.config import mongo as mongodb
5
5
  class mongo:
@@ -8,6 +8,7 @@ class mongo:
8
8
  __dbobj=None
9
9
  __tabobj=None
10
10
  def __setconn(self):
11
+ import pymongo
11
12
  if not self.__clientobj:
12
13
  if self.__config['retryWrites']:
13
14
  strs='mongodb://'+self.__config['host']+':'+self.__config['port']+'/'
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 1.2
2
2
  Name: kcwebs
3
- Version: 1.87
3
+ Version: 1.89
4
4
  Summary: kcwebs作为web开发而设计的高性能框架
5
5
  Home-page: https://docs.kwebapp.cn/index/index/2
6
6
  Author: 百里-坤坤
@@ -9,5 +9,5 @@ Maintainer: 坤坤
9
9
  Maintainer-email: fk1402936534@qq.com
10
10
  License: MIT License
11
11
  Description: kcwebs作为web开发而设计的高性能框架,采用全新的架构思想,注重易用性。遵循MIT开源许可协议发布,意味着个人和企业可以免费使用kcwebs,甚至允许把你基于kcwebs开发的应用开源或商业产品发布或销售。完整文档请访问:https://docs.kwebapp.cn/index/index/2
12
- Keywords: kcwebs1.87
12
+ Keywords: kcwebs1.89
13
13
  Platform: UNKNOWN
@@ -38,7 +38,6 @@ kcwebs/tempfile/kcwebs/app/config/redis.py
38
38
  kcwebs/utill/queues.py
39
39
  kcwebs/utill/db/model.py
40
40
  kcwebs/utill/db/mongodb.py
41
- kcwebs/utill/db/sqlite.py
42
41
  kcwebs/common/__init__.py
43
42
  kcwebs/common/autoload.py
44
43
  kcwebs/common/session.py
@@ -68,5 +67,4 @@ kcwebs/tempfile/kcwebs/app/config/other.py
68
67
  kcwebs/tempfile/kcwebs/app/config/redis.py
69
68
  kcwebs/utill/queues.py
70
69
  kcwebs/utill/db/model.py
71
- kcwebs/utill/db/mongodb.py
72
- kcwebs/utill/db/sqlite.py
70
+ kcwebs/utill/db/mongodb.py
@@ -1,6 +1,7 @@
1
- kcws>=1.91
2
- kcwmysql>=1.4
3
- kcwhttp>=1.1
1
+ kcws>=1.96
2
+ kcwmysql>=1.5
3
+ kcwsqlite>=1.1
4
+ kcwhttp>=1.3
4
5
  python-dateutil==2.9.0
5
6
  pymongo==3.10.0
6
7
  Mako==1.3.6
@@ -50,7 +50,7 @@ def start():
50
50
  packages = b,
51
51
 
52
52
 
53
- install_requires = ['kcws>=1.91','kcwmysql>=1.4','kcwhttp>=1.1','python-dateutil==2.9.0',
53
+ install_requires = ['kcws>=1.96','kcwmysql>=1.5','kcwsqlite>=1.1','kcwhttp>=1.3','python-dateutil==2.9.0',
54
54
  'pymongo==3.10.0','Mako==1.3.6','six>=1.12.0',
55
55
  # 'websockets==10.4',
56
56
  'curl_cffi==0.9.0',
@@ -1,684 +0,0 @@
1
- # -*- coding: utf-8 -*-
2
- from kcwebs.config import sqlite as sqliteconfig
3
- import time,traceback,re
4
- import random,sqlite3,os
5
- class sqlite:
6
- __config=sqliteconfig
7
- __configt={}
8
- __conn=None
9
- __cursor=None
10
- __sql=None
11
- __sqls=None
12
- def __close(self):
13
- if self.__conn:
14
- self.__cursor.close()
15
- self.__conn.close()
16
- self.__conn=None
17
- pass
18
- def __setconn(self):
19
- config=self.__config
20
- if self.__configt:
21
- config=self.__configt
22
- if not self.__conn:
23
- try:
24
- if '/' in config['db']:
25
- self.__conn = sqlite3.connect(config['db'])
26
- else:
27
- self.__conn = sqlite3.connect(os.path.split(os.path.realpath(__file__))[0]+"/sqlitedata/"+config['db'])
28
- except Exception as e:
29
- raise Exception(e)
30
- self.__cursor=self.__conn.cursor()
31
- self.__configt={}
32
- def __execute(self,typess='DQL'):
33
- self.__setconn()
34
- # print(self.__sql)
35
- try:
36
- res=self.__cursor.execute(self.__sql)
37
- except Exception as e:
38
-
39
- raise Exception(e)
40
- else:
41
- return res
42
- def connect(self,config):
43
- if isinstance(config,str):
44
- self.__configt['db']=config
45
- elif isinstance(config,dict):
46
- if 'db' in config:
47
- self.__configt['db']=config['db']
48
- return self
49
- __table=""
50
- def table(self,table):
51
- """设置表名
52
-
53
- 参数 table:str 表名
54
- """
55
- self.__table=table
56
- return self
57
- def query(self,sql):
58
- self.__sql=sql
59
- self.__execute(sql,'DQL')
60
- self.__close()
61
- def execute(self,sql):
62
- self.__sql=sql
63
- res=self.__execute('DML')
64
- rowcount=res.rowcount
65
- self.__close()
66
- return rowcount
67
- # def create_table(self):
68
- # self.__sql=("CREATE TABLE "+self.__table+
69
- # "(ID INT PRIMARY KEY NOT NULL,"+
70
- # "NAME TEXT NOT NULL,"+
71
- # "AGE INT NOT NULL,"+
72
- # "ADDRESS CHAR(50),"+
73
- # "SALARY REAL);")
74
- # # print(self.__sql)
75
- # # exit()
76
- # self.execute(self.__sql)
77
- def select(self,id=None):
78
- """select查询
79
-
80
- 返回 list(列表)
81
- """
82
- if id :
83
- self.__where="id=%d" % id
84
- self.__setsql()
85
- if self.__buildSql:
86
- self.__sqls="("+self.__sql+")"
87
- self.__None()
88
- return self.__sqls
89
- self.__execute()
90
- description=self.__cursor.description #获取字段
91
- result = self.__cursor.fetchall() #获取查询结果
92
- self.__close()
93
- lists=[]
94
- data_dict=[]
95
- for field in description:#获取字段
96
- data_dict.append(field[0])
97
- for k in result:
98
- i=0
99
- dicts={}
100
- for j in k:
101
- dicts[data_dict[i]]=j
102
- i=i+1
103
- lists.append(dicts)
104
- self.__None(table=False)
105
- return lists
106
- def find(self,id=None):
107
- """查询一条记录
108
-
109
- 返回 字典
110
- """
111
- if id :
112
- self.__where="id=%s" % id
113
- self.limit(1)
114
- self.__setsql()
115
- if self.__buildSql:
116
- self.__sqls="("+self.__sql+")"
117
- self.__None()
118
- return self.__sqls
119
-
120
- self.__execute()
121
- description=self.__cursor.description #获取字段
122
- result = self.__cursor.fetchall() #获取查询结果
123
- self.__close()
124
- data_dict=[]
125
- for field in description:#获取字段
126
- data_dict.append(field[0])
127
- dicts={}
128
- for k in result:
129
- i=0
130
- for j in k:
131
- dicts[data_dict[i]]=j
132
- i=i+1
133
- self.__None(table=False)
134
- return dicts
135
- def getfield(self):
136
- """查询表字段
137
-
138
- 返回 字典
139
- """
140
- self.limit(1)
141
- self.__setsql()
142
- if self.__buildSql:
143
- self.__sqls="("+self.__sql+")"
144
- self.__None()
145
- return self.__sqls
146
-
147
- self.__execute()
148
- description=self.__cursor.description #获取字段
149
- data_dict=[]
150
- for field in description:#获取字段
151
- data_dict.append(field[0])
152
- return data_dict
153
- def count(self,field="*"):
154
- """查询数量
155
-
156
- 返回 int 数字
157
- """
158
- self.__field=field
159
- self.__setsql('count')
160
- if self.__buildSql:
161
- self.__sqls="("+self.__sql+")"
162
- return self.__sql
163
- self.__execute()
164
- result = self.__cursor.fetchall() #获取查询结果
165
- self.__close()
166
- cou=int(result[0][0])
167
- self.__None(table=False)
168
- return cou
169
- def max(self,field):
170
- """查询某字段的最大值
171
-
172
- 返回 int 数字
173
- """
174
- self.__field=field
175
- self.__setsql('max')
176
- if self.__buildSql:
177
- self.__sqls="("+self.__sql+")"
178
- return self.__sql
179
- self.__execute()
180
- result = self.__cursor.fetchall() #获取查询结果
181
- self.__close()
182
- cou=int(result[0][0])
183
- self.__None(table=False)
184
- return cou
185
- def min(self,field):
186
- """查询某字段的最小值
187
-
188
- 返回 int 数字
189
- """
190
- self.__field=field
191
- self.__setsql('min')
192
- if self.__buildSql:
193
- self.__sqls="("+self.__sql+")"
194
- return self.__sql
195
- self.__execute()
196
- result = self.__cursor.fetchall() #获取查询结果
197
- self.__close()
198
- cou=int(result[0][0])
199
- self.__None(table=False)
200
- return cou
201
- def avg(self,field):
202
- """查询某字段的平均值
203
-
204
- 返回 int 数字
205
- """
206
- self.__field=field
207
- self.__setsql('avg')
208
- if self.__buildSql:
209
- self.__sqls="("+self.__sql+")"
210
- return self.__sql
211
- self.__execute()
212
- result = self.__cursor.fetchall() #获取查询结果
213
- self.__close()
214
- cou=int(result[0][0])
215
- self.__None(table=False)
216
- return cou
217
- def sum(self,field):
218
- """查询某字段之和
219
-
220
- 返回 int 数字
221
- """
222
- self.__field=field
223
- self.__setsql('sum')
224
- if self.__buildSql:
225
- self.__sqls="("+self.__sql+")"
226
- return self.__sql
227
- self.__execute()
228
- result = self.__cursor.fetchall() #获取查询结果
229
- self.__close()
230
- cou=int(result[0][0])
231
- self.__None(table=False)
232
- return cou
233
- def update(self,data,affair=False):
234
- """数据表更新
235
-
236
- 参数 data 要更新的内容 格式:{"name":"测试","age":20}
237
-
238
- 参数 affair 是否开启事务 True表示手动提交事务 False表示自动提交事务
239
- """
240
- self.__setsql('update',data)
241
- res=self.__execute('DML')
242
- if affair==False and self.__startTrans==False:
243
- self.commit()
244
- rowcount=res.rowcount
245
- self.__close()
246
- self.__None(table=False)
247
- return rowcount
248
- def delete(self,affair=False):
249
- """数据表删除
250
-
251
- 参数 affair 是否开启事务 True表示手动提交事务 False表示自动提交事务
252
- """
253
- self.__setsql('delete')
254
- if self.__where:
255
- res=self.__execute('DML')
256
- else:
257
- return 0
258
- if affair==False and self.__startTrans==False:
259
- self.commit()
260
- rowcount=res.rowcount
261
- self.__close()
262
- self.__None(table=False)
263
- return rowcount
264
- def insert(self,dicts,affair=False):
265
- """插入数据库 单条插入或多条插入
266
-
267
- 参数 dicts 要插入的内容 单条格式:{"name":"测试","age":20} 。 多条格式:[{"name":"测试","age":20},{"name":"测试","age":20}]
268
-
269
- 参数 affair 是否开启事务 True表示手动提交事务 False表示自动提交事务
270
-
271
- 返回插入的数量
272
- """
273
- self.__setsql('insert',dicts)
274
- res=self.__execute('DML')
275
- if affair==False and self.__startTrans==False:
276
- self.commit()
277
- rowcount=res.rowcount
278
- self.__close()
279
- self.__None(table=False)
280
- return rowcount
281
- __startTrans=False
282
- def startTrans(self):
283
- "开启事务,仅对 update方法、delete方法、install方法有效"
284
- self.__startTrans=True
285
- def commit(self):
286
- """事务提交
287
-
288
- 增删改后的任务进行提交
289
- """
290
- self.__conn.commit()
291
- def rollback(self):
292
- """事务回滚
293
-
294
- 增删改后的任务进行撤销
295
- """
296
- self.__conn.rollback()
297
- def getsql(self):
298
- """得到生成的sql语句"""
299
- return self.__sql
300
- __buildSql=None
301
- def buildSql(self):
302
- """构造子查询"""
303
- self.__buildSql=True
304
- return self
305
- def __None(self,table=True):
306
- "清除所有赋值条件"
307
- self.__lock=None
308
- self.__distinct=None
309
- self.__join=None
310
- self.__joinstr=''
311
- self.__alias=None
312
- self.__having=None
313
- self.__group=None
314
- self.__group1=None
315
- self.__order=None
316
- self.__order1=None
317
- self.__limit=None
318
- self.__field="*"
319
- self.__where=None
320
- self.__wheres=()
321
- self.__buildSql=None
322
- if table:
323
- self.__table=None
324
- __where=None
325
- __wheres=()
326
- def where(self,where = None,*wheres):
327
- """设置过滤条件
328
-
329
- 传入方式:
330
- "id",2 表示id='2'
331
-
332
- "id","in",2,3,4,5,6,...表示 id in (2,3,4,5,6,...)
333
-
334
- "id","in",[2,3,4,5,6,...]表示 id in (2,3,4,5,6,...)
335
-
336
- [("id","gt",6000),"and",("name","like","%超")] 表示 ( id > "6000" and name LIKE "%超" )
337
-
338
- "id","eq",1 表示 id = '1'
339
-
340
- eq 等于
341
- neq 不等于
342
- gt 大于
343
- egt 大于等于
344
- lt 小于
345
- elt 小于等于
346
- like LIKE
347
- """
348
- self.__where=where
349
- self.__wheres=wheres
350
- # print(len(self.__wheres))
351
- return self
352
- __field='*'
353
- def field(self,field = "*"):
354
- """设置过滤显示条件
355
-
356
- 参数 field:str 字符串
357
- """
358
- self.__field=field
359
- return self
360
- __limit=[]
361
- def limit(self,offset, length = None):
362
- """设置查询数量
363
-
364
- 参数 offset:int 起始位置
365
-
366
- 参数 length:int 查询数量
367
- """
368
- self.__limit=[offset,length]
369
- return self
370
- def page(self,pagenow=1, length = 20):
371
- """设置分页查询
372
-
373
- 参数 pagenow:int 页码
374
-
375
- 参数 length:int 查询数量
376
- """
377
- offset=(pagenow-1)*length
378
- self.__limit=[offset,length]
379
- return self
380
- __order=None
381
- __order1=None
382
- def order(self,strs=None,*strs1):
383
- """设置排序查询
384
-
385
- 传入方式:
386
-
387
- "id desc"
388
-
389
- "id",'name','appkey','asc'
390
-
391
- "id",'name','appkey' 不包含asc或desc的情况下 默认是desc
392
-
393
- ['id','taskid',{"task_id":"desc"}]
394
- """
395
- self.__order=strs
396
- self.__order1=strs1
397
- return self
398
- __group=None
399
- __group1=None
400
- def group(self,strs=None,*strs1):
401
- """设置分组查询
402
-
403
- 传入方式:
404
-
405
- "id,name"
406
-
407
- "id","name"
408
- """
409
- self.__group=strs
410
- self.__group1=strs1
411
- return self
412
- __having=None
413
- def having(self,strs=None):
414
- """用于配合group方法完成从分组的结果中筛选(通常是聚合条件)数据
415
-
416
- 参数 strs:string 如:"count(time)>3"
417
- """
418
- self.__having=strs
419
- return self
420
-
421
- __alias=None
422
- def alias(self,strs=None):
423
- """用于设置当前数据表的别名,便于使用其他的连贯操作例如join方法等。
424
-
425
- 参数 strs:string 默认当前表作为别名
426
- """
427
- if strs:
428
- self.__alias=strs
429
- else:
430
- self.__alias=self.__table
431
- return self
432
- __join=None
433
- __joinstr=''
434
- def join(self,strs,on=None,types='INNER'):
435
- """用于根据两个或多个表中的列之间的关系,从这些表中查询数据
436
-
437
- 参数 strs string 如:"test t1" test表设置别名t1
438
-
439
- 参数 on string 如:"t1.id=t2.pid" 设置连接条件
440
-
441
- 参数 types 支持INNER、LEFT、RIGHT、FULL 默认INNER
442
-
443
- """
444
- joinstr=''
445
- if strs and on:
446
- joinstr=joinstr+types+" JOIN "+strs+" ON "+on+" "
447
- if joinstr:
448
- self.__joinstr=self.__joinstr+joinstr
449
- return self
450
- __distinct=None
451
- def distinct(self,bools=None):
452
- "用于返回唯一不同的值,配合field方法使用生效,消除所有重复的记录,并只获取唯一一次记录。"
453
- self.__distinct=bools
454
- return self
455
- __lock=None
456
- def lock(self,strs=None):
457
- """用于数据库的锁机制,在查询或者执行操作的时候使用 (暂未实现)
458
-
459
- 排他锁 (Exclusive lock)
460
-
461
- 共享锁 (Shared lock)
462
-
463
- 参数 strs 如:True表示自动在生成的SQL语句最后加上FOR UPDATE,
464
-
465
-
466
- """
467
- # self.__lock=strs
468
- return self
469
- def __setsql(self,types=None,data = {}):
470
- """生成sql语句"""
471
- if types==None:
472
- self.__sql="SELECT"
473
- if self.__distinct and self.__field:
474
- self.__sql=self.__sql+" DISTINCT"
475
- if self.__alias:
476
- self.__sql=self.__sql+" %s FROM %s %s" % (self.__field,self.__table,self.__alias)
477
- else:
478
- self.__sql=self.__sql+" %s FROM %s" % (self.__field,self.__table)
479
- elif types=='count':
480
- self.__sql="SELECT COUNT(%s) FROM %s" % (self.__field,self.__table)
481
- elif types=='max':
482
- self.__sql="SELECT MAX(%s) FROM %s" % (self.__field,self.__table)
483
- elif types=='min':
484
- self.__sql="SELECT MIN(%s) FROM %s" % (self.__field,self.__table)
485
- elif types=='avg':
486
- self.__sql="SELECT AVG(%s) FROM %s" % (self.__field,self.__table)
487
- elif types=='sum':
488
- self.__sql="SELECT SUM(%s) FROM %s" % (self.__field,self.__table)
489
- elif types=='update':
490
- strs=''
491
- for k in data:
492
- if isinstance(data[k],str):
493
- strs=strs+" %s = '%s' ," % (k,self.escape_string(data[k]))
494
- else:
495
- strs=strs+" %s = %s ," % (k,data[k])
496
- strs=strs[:-1]
497
- self.__sql="UPDATE %s SET %s" % (self.__table,strs)
498
- # print(self.__sql)
499
- elif types=='delete':
500
- self.__sql="DELETE FROM %s" % (self.__table)
501
- elif types=='insert':
502
- if isinstance(data,dict):
503
- strs=''
504
- val=''
505
- for k in data:
506
- strs=strs+"%s," % k
507
- if isinstance(data[k],str):
508
- val=val+"'%s'," % self.escape_string(data[k])
509
- else:
510
- val=val+"%s," % data[k]
511
- strs=strs[:-1]
512
- val=val[:-1]
513
- self.__sql="INSERT INTO "+str(self.__table)+" ("+strs+") VALUES ("+val+")"
514
- # print(self.__sql)
515
- elif isinstance(data,list):
516
- strs=''
517
- val='('
518
- for k in data[0]:
519
- strs=strs+" , "+k
520
- for k in data:
521
- for j in k:
522
- if isinstance(k[j],str):
523
- val=val+"'"+str(k[j])+"',"
524
- else:
525
- val=val+str(k[j])+","
526
- val=val[:-1]
527
- val=val+"),("
528
- val=val[:-2]
529
- self.__sql="INSERT INTO "+str(self.__table)+" ("+strs[3:]+") VALUES "+val
530
-
531
- if self.__joinstr:
532
- # print(self.__sql)
533
- self.__sql=self.__sql+" "+self.__joinstr
534
- if self.__where:
535
- if isinstance(self.__where,str):
536
- if self.__wheres:
537
- if len(self.__wheres) == 2:
538
- if isinstance(self.__wheres[1],list):
539
- self.__sql=self.__sql + " WHERE %s %s (" % (self.__where,self.__operator(self.__wheres[0]))
540
- for k in self.__wheres[1]:
541
- self.__sql=self.__sql+str(k)+","
542
- self.__sql=self.__sql[:-1]+")"
543
- else:
544
- self.__sql=self.__sql + " WHERE %s %s '%s'" % (self.__where,self.__operator(self.__wheres[0]),self.__wheres[1])
545
- elif len(self.__wheres) > 2:
546
- if self.__wheres[0]=='in':
547
- strs=str(self.__wheres[1])
548
- i=0
549
- for k in self.__wheres:
550
- if i > 1:
551
- strs=strs+","+str(k)
552
- i=i+1
553
- self.__sql=self.__sql + " WHERE %s in (%s)" % (self.__where,strs)
554
- else:
555
- self.__sql=self.__sql + " WHERE %s = '%s'" % (self.__where,self.__wheres[0])
556
- else:
557
- self.__sql=self.__sql + " WHERE %s" % self.__where
558
- elif isinstance(self.__where,list):
559
- self.__sql=self.__sql + " WHERE %s" % self.__listTrans()
560
- else:
561
- print("参数where类型错误",type(self.__where),self.__where)
562
- if self.__order:
563
- s=''
564
- if isinstance(self.__order,list):
565
- for strs in self.__order:
566
- if isinstance(strs,str):
567
- s=s+strs+","
568
- else:
569
- pass
570
- for key in strs:
571
- s=s+key+" "+strs[key]
572
- s=s+","
573
- s=s[:-1]
574
- if isinstance(self.__order,str):
575
- if self.__order1:
576
- if len(self.__order1) > 1:
577
- if self.__order1[len(self.__order1)-1] == 'desc' or self.__order1[len(self.__order1)-1] == 'asc':
578
- i=0
579
- while i<len(self.__order1)-1:
580
- s=s+self.__order1[i]+","
581
- i=i+1
582
- s=s[:-1]+" "+self.__order1[len(self.__order1)-1]
583
- else:
584
- for key in self.__order1:
585
- s=s+key+","
586
- s=s[:-1]
587
- s=s+" asc"
588
- s=self.__order+","+s
589
- else:
590
- s=s[:-1]+self.__order1[0]
591
- s=self.__order+" "+s
592
- else:
593
- s=self.__order
594
- # print(s)
595
- self.__sql=self.__sql+" ORDER BY "+s
596
- if self.__group:
597
- s=self.__group
598
- if self.__group1:
599
- for key in self.__group1:
600
- s=s+","+key
601
- self.__sql=self.__sql+" GROUP BY "+s
602
- if self.__having:
603
- self.__sql=self.__sql+" HAVING "+self.__having
604
- if self.__limit:
605
- if self.__limit[1]:
606
- self.__sql=self.__sql+" LIMIT %d,%d" % (self.__limit[0],self.__limit[1])
607
- else:
608
- self.__sql=self.__sql+" LIMIT %d" % self.__limit[0]
609
- if self.__lock:
610
- if isinstance(self.__lock,str):
611
- self.__sql=self.__sql+" "+self.__lock
612
- else:
613
- self.__sql=self.__sql+' Exclusive lock'
614
- # print(self.__sql)
615
- def __listTrans(self):
616
- """列表转换sql表达式
617
- 返回 字符串
618
- """
619
- strs=''
620
- #[('id', 'eq', '1'), 'or', ('id', 'eq', '2')]
621
- for k in self.__where:
622
- if isinstance(k,tuple):
623
- t=0
624
- for j in k:
625
- if t==0:
626
- strs=strs+' '+str(j)+' '
627
- elif t==1:
628
- strs=strs+self.__operator(j)
629
- if t==2:
630
- strs=strs+' "'+str(j)+'" '
631
- t=t+1
632
- elif isinstance(k,str):
633
- strs=strs+k
634
- return "("+strs+")"
635
- def __operator(self,strs):
636
- """运算符转换
637
- 参数 strs 待转的字符串
638
- 返回 已转换的运算符
639
-
640
- 符号定义
641
- eq 等于
642
- neq 不等于
643
- gt 大于
644
- egt 大于等于
645
- lt 小于
646
- elt 小于等于
647
- like LIKE
648
- """
649
- strss=strs.upper()
650
- if strss == 'EQ':
651
- k='='
652
- elif strss == 'NEQ':
653
- k='<>'
654
- elif strss == 'GT':
655
- k='>'
656
- elif strss == 'EGT':
657
- k='>='
658
- elif strss == 'LT':
659
- k='<'
660
- elif strss == 'ELT':
661
- k='<='
662
- elif strss == 'LIKE':
663
- k='LIKE'
664
- else:
665
- k=strss
666
- return k
667
- def escape_string(self,value):
668
- """sqlite3 字符串转义
669
-
670
- Value 字符串
671
- """
672
- # value = value.replace('/', '//')
673
- value = value.replace("'", "''")
674
- # value = value.replace('[', '/[')
675
- # value = value.replace(']', '/]')
676
- # value = value.replace('%', '/%')
677
- # value = value.replace('&', '/&')
678
- # value = value.replace('_', '/_')
679
- # value = value.replace('(', '/(')
680
- # value = value.replace(')', '/)')
681
- return value
682
-
683
-
684
-
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes