kcsqlite 1.0__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.
kcsqlite-1.0/PKG-INFO ADDED
@@ -0,0 +1,13 @@
1
+ Metadata-Version: 1.2
2
+ Name: kcsqlite
3
+ Version: 1.0
4
+ Summary: kcsqlite
5
+ Home-page: UNKNOWN
6
+ Author: 百里
7
+ Author-email: kcwebs@kwebapp.cn
8
+ Maintainer: 坤坤
9
+ Maintainer-email: fk1402936534@qq.com
10
+ License: MIT License
11
+ Description: UNKNOWN
12
+ Keywords: kcsqlite1.0
13
+ Platform: UNKNOWN
@@ -0,0 +1,4 @@
1
+ # -*- coding: utf-8 -*-
2
+ __version__ = '1.0'
3
+ from .sqliteclass import sqliteclass
4
+ sqlite=sqliteclass()
@@ -0,0 +1,730 @@
1
+ # -*- coding: utf-8 -*-
2
+ import os,threading,time,copy
3
+ def kcwsqlite_is_index(params,index):
4
+ try:
5
+ params[index]
6
+ except KeyError:
7
+ return False
8
+ except IndexError:
9
+ return False
10
+ else:
11
+ return True
12
+ try:
13
+ import sqlite3
14
+ from kcwweb.config import sqlite as sqliteconfig
15
+ if not kcwsqlite_is_index(sqliteconfig,'th_lock'):
16
+ sqliteconfig['th_lock']=False
17
+ if not kcwsqlite_is_index(sqliteconfig,'debug'):
18
+ sqliteconfig['debug']=False
19
+ except:
20
+ sqliteconfig={}
21
+ sqliteconfig['debug']=False
22
+ sqliteconfig['th_lock']=False
23
+ sqliteconfig['db']='kcwsdb' # 数据库文件存放地址
24
+ def kcwsqlite_print_log(*strs):
25
+ print(time.strftime("%Y-%m-%d %H:%M:%S"),*strs)
26
+ class sqliteclass:
27
+ __config=sqliteconfig
28
+ __configt={}
29
+ __conn=None
30
+ __cursor=None
31
+ __sql=None
32
+ __sqls=None
33
+ def __close(self):
34
+ if self.__conn:
35
+ try:
36
+ self.__cursor.close()
37
+ except:pass
38
+ try:
39
+ self.__conn.close()
40
+ except:pass
41
+ self.__conn=None
42
+ self.__None()
43
+ self.__close_th_lock()
44
+ def __setconn(self):
45
+ config=self.__config
46
+ if self.__configt:
47
+ config=self.__configt
48
+ if not self.__conn:
49
+ try:
50
+ if '/' in config['db']:
51
+ self.__conn = sqlite3.connect(config['db'])
52
+ else:
53
+ self.__conn = sqlite3.connect(os.path.split(os.path.realpath(__file__))[0]+"/sqlitedata/"+config['db'])
54
+ except Exception as e:
55
+ self.__close()
56
+ raise Exception(e)
57
+ self.__cursor=self.__conn.cursor()
58
+ self.__configt={}
59
+ def __execute(self,typess='DQL'):
60
+ self.__setconn()
61
+ if self.__config['debug']:
62
+ print('sqlite',self.__sql)
63
+ try:
64
+ res=self.__cursor.execute(self.__sql)
65
+ except Exception as e:
66
+ self.__close()
67
+ raise Exception(e)
68
+ else:
69
+ return res
70
+ __thlock={
71
+ 'obj':None,
72
+ 'status':False
73
+ }
74
+ def __start_th_lock(self):
75
+ """开启线程锁 多线程中建议开启 注意 这个python多线程锁 而不是数据库事务锁"""
76
+ if not self.__thlock['obj']:
77
+ self.__thlock['obj']=threading.Lock()
78
+ self.__thlock['obj'].acquire()
79
+ self.__thlock['status']=True
80
+ if self.__config['debug']:
81
+ kcwsqlite_print_log('开启线程锁sqlite')
82
+ def __close_th_lock(self):
83
+ """退出线程锁 这个python多线程锁 而不是数据库事务锁"""
84
+ if self.__thlock['status']:
85
+ self.__thlock['obj'].release()
86
+ self.__thlock['status']=False
87
+ if self.__config['debug']:
88
+ kcwsqlite_print_log('退出线程锁sqlite')
89
+ def connect(self,config,th_lock='no'):
90
+ """
91
+ th_lock 是否开启线程锁 多线程中建议开启 注意 这个python多线程锁 而不是sqlite库事务锁 也可以在配置信息中全局开启
92
+ """
93
+ if th_lock!='no':
94
+ self.__config['th_lock']=th_lock
95
+ if self.__config['th_lock']:
96
+ self.__start_th_lock()
97
+
98
+ if isinstance(config,str):
99
+ self.__configt['db']=config
100
+ elif isinstance(config,dict):
101
+ if 'db' in config:
102
+ self.__configt['db']=config['db']
103
+ return self
104
+ __table=""
105
+ def table(self,table):
106
+ """设置表名
107
+
108
+ 参数 table:str 表名
109
+ """
110
+ if self.__config['debug']:
111
+ print('sqlite set_table',table,self.__config)
112
+ self.__table=table
113
+ return self
114
+ def query(self,sql):
115
+ self.__sql=sql
116
+ self.__execute(sql,'DQL')
117
+ self.__close()
118
+ def execute(self,sql):
119
+ self.__sql=sql
120
+ res=self.__execute('DML')
121
+ rowcount=res.rowcount
122
+ self.__close()
123
+ return rowcount
124
+ def select(self,id=None):
125
+ """select查询
126
+
127
+ 返回 list(列表)
128
+ """
129
+ if id :
130
+ self.__where="id=%d" % id
131
+ self.__setsql()
132
+ if self.__buildSql:
133
+ self.__sqls="("+self.__sql+")"
134
+ self.__close()
135
+ return self.__sqls
136
+ self.__execute()
137
+ description=self.__cursor.description #获取字段
138
+ result = self.__cursor.fetchall() #获取查询结果
139
+
140
+ lists=[]
141
+ data_dict=[]
142
+ for field in description:#获取字段
143
+ data_dict.append(field[0])
144
+ for k in result:
145
+ i=0
146
+ dicts={}
147
+ for j in k:
148
+ dicts[data_dict[i]]=j
149
+ i=i+1
150
+ lists.append(dicts)
151
+ self.__close()
152
+ return lists
153
+ def find(self,id=None):
154
+ """查询一条记录
155
+
156
+ 返回 字典
157
+ """
158
+ if id :
159
+ self.__where="id=%s" % id
160
+ self.limit(1)
161
+ self.__setsql()
162
+ if self.__buildSql:
163
+ self.__sqls="("+self.__sql+")"
164
+ self.__close()
165
+ return self.__sqls
166
+
167
+ self.__execute()
168
+ description=self.__cursor.description #获取字段
169
+ result = self.__cursor.fetchall() #获取查询结果
170
+
171
+ data_dict=[]
172
+ for field in description:#获取字段
173
+ data_dict.append(field[0])
174
+ dicts={}
175
+ for k in result:
176
+ i=0
177
+ for j in k:
178
+ dicts[data_dict[i]]=j
179
+ i=i+1
180
+ self.__close()
181
+ return dicts
182
+ def getfield(self):
183
+ """查询表字段
184
+
185
+ 返回 字典
186
+ """
187
+ self.limit(1)
188
+ self.__setsql()
189
+ if self.__buildSql:
190
+ self.__sqls="("+self.__sql+")"
191
+ self.__close()
192
+ return self.__sqls
193
+
194
+ self.__execute()
195
+ description=self.__cursor.description #获取字段
196
+ data_dict=[]
197
+ for field in description:#获取字段
198
+ data_dict.append(field[0])
199
+ self.__close()
200
+ return data_dict
201
+ def count(self,field="*"):
202
+ """查询数量
203
+
204
+ 返回 int 数字
205
+ """
206
+ self.__field=field
207
+ self.__setsql('count')
208
+ if self.__buildSql:
209
+ self.__sqls="("+self.__sql+")"
210
+ self.__close()
211
+ return self.__sql
212
+ self.__execute()
213
+ result = self.__cursor.fetchall() #获取查询结果
214
+ cou=int(result[0][0])
215
+ self.__close()
216
+ return cou
217
+ def max(self,field):
218
+ """查询某字段的最大值
219
+
220
+ 返回 int 数字
221
+ """
222
+ self.__field=field
223
+ self.__setsql('max')
224
+ if self.__buildSql:
225
+ self.__sqls="("+self.__sql+")"
226
+ self.__close()
227
+ return self.__sql
228
+ self.__execute()
229
+ result = self.__cursor.fetchall() #获取查询结果
230
+ self.__close()
231
+ cou=int(result[0][0])
232
+ return cou
233
+ def min(self,field):
234
+ """查询某字段的最小值
235
+
236
+ 返回 int 数字
237
+ """
238
+ self.__field=field
239
+ self.__setsql('min')
240
+ if self.__buildSql:
241
+ self.__sqls="("+self.__sql+")"
242
+ self.__close()
243
+ return self.__sql
244
+ self.__execute()
245
+ result = self.__cursor.fetchall() #获取查询结果
246
+ self.__close()
247
+ cou=int(result[0][0])
248
+ return cou
249
+ def avg(self,field):
250
+ """查询某字段的平均值
251
+
252
+ 返回 int 数字
253
+ """
254
+ self.__field=field
255
+ self.__setsql('avg')
256
+ if self.__buildSql:
257
+ self.__sqls="("+self.__sql+")"
258
+ self.__close()
259
+ return self.__sql
260
+ self.__execute()
261
+ result = self.__cursor.fetchall() #获取查询结果
262
+ self.__close()
263
+ cou=int(result[0][0])
264
+ return cou
265
+ def sum(self,field):
266
+ """查询某字段之和
267
+
268
+ 返回 int 数字
269
+ """
270
+ self.__field=field
271
+ self.__setsql('sum')
272
+ if self.__buildSql:
273
+ self.__sqls="("+self.__sql+")"
274
+ self.__close()
275
+ return self.__sql
276
+ self.__execute()
277
+ result = self.__cursor.fetchall() #获取查询结果
278
+ self.__close()
279
+ cou=int(result[0][0])
280
+ return cou
281
+ def update(self,data,affair=False):
282
+ """数据表更新
283
+
284
+ 参数 data 要更新的内容 格式:{"name":"测试","age":20}
285
+
286
+ 参数 affair 是否开启事务 True表示手动提交事务 False表示自动提交事务
287
+ """
288
+ self.__setsql('update',data)
289
+ res=self.__execute('DML')
290
+ if affair==False and self.__startTrans==False:
291
+ self.commit()
292
+ rowcount=res.rowcount
293
+ self.__close()
294
+ return rowcount
295
+ def delete(self,affair=False):
296
+ """数据表删除
297
+
298
+ 参数 affair 是否开启事务 True表示手动提交事务 False表示自动提交事务
299
+ """
300
+ self.__setsql('delete')
301
+ if self.__where:
302
+ res=self.__execute('DML')
303
+ rowcount=res.rowcount
304
+ else:
305
+ rowcount=0
306
+ if affair==False and self.__startTrans==False:
307
+ self.commit()
308
+ self.__close()
309
+ return rowcount
310
+ def insert(self,dicts,affair=False):
311
+ """插入数据库 单条插入或多条插入
312
+
313
+ 参数 dicts 要插入的内容 单条格式:{"name":"测试","age":20} 。 多条格式:[{"name":"测试","age":20},{"name":"测试","age":20}]
314
+
315
+ 参数 affair 是否开启事务 True表示手动提交事务 False表示自动提交事务
316
+
317
+ 返回插入的数量
318
+ """
319
+ self.__setsql('insert',dicts)
320
+ res=self.__execute('DML')
321
+ if affair==False and self.__startTrans==False:
322
+ self.commit()
323
+ rowcount=res.rowcount
324
+ self.__close()
325
+ return rowcount
326
+ __startTrans=False
327
+ def startTrans(self):
328
+ "开启事务,仅对 update方法、delete方法、install方法有效"
329
+ self.__startTrans=True
330
+ def commit(self):
331
+ """事务提交
332
+
333
+ 增删改后的任务进行提交
334
+ """
335
+ self.__conn.commit()
336
+ def rollback(self):
337
+ """事务回滚
338
+
339
+ 增删改后的任务进行撤销
340
+ """
341
+ self.__conn.rollback()
342
+ def getsql(self):
343
+ """得到生成的sql语句"""
344
+ return self.__sql
345
+ __buildSql=None
346
+ def buildSql(self):
347
+ """构造子查询"""
348
+ self.__buildSql=True
349
+ return self
350
+ def __None(self):
351
+ "清除所有赋值条件"
352
+ self.__lock=None
353
+ self.__distinct=None
354
+ self.__join=None
355
+ self.__joinstr=''
356
+ self.__alias=None
357
+ self.__having=None
358
+ self.__group=None
359
+ self.__group1=None
360
+ self.__order=None
361
+ self.__order1=None
362
+ self.__limit=None
363
+ self.__field="*"
364
+ self.__where=None
365
+ self.__wheres=()
366
+ self.__buildSql=None
367
+ self.__table=None
368
+ __where=None
369
+ __wheres=()
370
+ def where(self,where = None,*wheres):
371
+ """设置过滤条件
372
+
373
+ 传入方式:
374
+ "id",2 表示id='2'
375
+
376
+ "id","in",2,3,4,5,6,...表示 id in (2,3,4,5,6,...)
377
+
378
+ "id","in",[2,3,4,5,6,...]表示 id in (2,3,4,5,6,...)
379
+
380
+ [("id","gt",6000),"and",("name","like","%超")] 表示 ( id > "6000" and name LIKE "%超" )
381
+
382
+ "id","eq",1 表示 id = '1'
383
+
384
+ eq 等于
385
+ neq 不等于
386
+ gt 大于
387
+ egt 大于等于
388
+ lt 小于
389
+ elt 小于等于
390
+ like LIKE
391
+ """
392
+ self.__where=where
393
+ self.__wheres=wheres
394
+ # print(len(self.__wheres))
395
+ if self.__config['debug']:
396
+ print('sqlite __where',where,wheres)
397
+ return self
398
+ __field='*'
399
+ def field(self,field = "*"):
400
+ """设置过滤显示条件
401
+
402
+ 参数 field:str 字符串
403
+ """
404
+ self.__field=field
405
+ return self
406
+ __limit=[]
407
+ def limit(self,offset, length = None):
408
+ """设置查询数量
409
+
410
+ 参数 offset:int 起始位置
411
+
412
+ 参数 length:int 查询数量
413
+ """
414
+ self.__limit=[offset,length]
415
+ return self
416
+ def page(self,pagenow=1, length = 20):
417
+ """设置分页查询
418
+
419
+ 参数 pagenow:int 页码
420
+
421
+ 参数 length:int 查询数量
422
+ """
423
+ offset=(pagenow-1)*length
424
+ self.__limit=[offset,length]
425
+ return self
426
+ __order=None
427
+ __order1=None
428
+ def order(self,strs=None,*strs1):
429
+ """设置排序查询
430
+
431
+ 传入方式:
432
+
433
+ "id desc"
434
+
435
+ "id",'name','appkey','asc'
436
+
437
+ "id",'name','appkey' 不包含asc或desc的情况下 默认是desc
438
+
439
+ ['id','taskid',{"task_id":"desc"}]
440
+ """
441
+ self.__order=strs
442
+ self.__order1=strs1
443
+ return self
444
+ __group=None
445
+ __group1=None
446
+ def group(self,strs=None,*strs1):
447
+ """设置分组查询
448
+
449
+ 传入方式:
450
+
451
+ "id,name"
452
+
453
+ "id","name"
454
+ """
455
+ self.__group=strs
456
+ self.__group1=strs1
457
+ return self
458
+ __having=None
459
+ def having(self,strs=None):
460
+ """用于配合group方法完成从分组的结果中筛选(通常是聚合条件)数据
461
+
462
+ 参数 strs:string 如:"count(time)>3"
463
+ """
464
+ self.__having=strs
465
+ return self
466
+
467
+ __alias=None
468
+ def alias(self,strs=None):
469
+ """用于设置当前数据表的别名,便于使用其他的连贯操作例如join方法等。
470
+
471
+ 参数 strs:string 默认当前表作为别名
472
+ """
473
+ if strs:
474
+ self.__alias=strs
475
+ else:
476
+ self.__alias=self.__table
477
+ return self
478
+ __join=None
479
+ __joinstr=''
480
+ def join(self,strs,on=None,types='INNER'):
481
+ """用于根据两个或多个表中的列之间的关系,从这些表中查询数据
482
+
483
+ 参数 strs string 如:"test t1" test表设置别名t1
484
+
485
+ 参数 on string 如:"t1.id=t2.pid" 设置连接条件
486
+
487
+ 参数 types 支持INNER、LEFT、RIGHT、FULL 默认INNER
488
+
489
+ """
490
+ joinstr=''
491
+ if strs and on:
492
+ joinstr=joinstr+types+" JOIN "+strs+" ON "+on+" "
493
+ if joinstr:
494
+ self.__joinstr=self.__joinstr+joinstr
495
+ return self
496
+ __distinct=None
497
+ def distinct(self,bools=None):
498
+ "用于返回唯一不同的值,配合field方法使用生效,消除所有重复的记录,并只获取唯一一次记录。"
499
+ self.__distinct=bools
500
+ return self
501
+ __lock=None
502
+ def lock(self,strs=None):
503
+ """用于数据库的锁机制,在查询或者执行操作的时候使用 (暂未实现)
504
+
505
+ 排他锁 (Exclusive lock)
506
+
507
+ 共享锁 (Shared lock)
508
+
509
+ 参数 strs 如:True表示自动在生成的SQL语句最后加上FOR UPDATE,
510
+
511
+
512
+ """
513
+ # self.__lock=strs
514
+ return self
515
+ def __setsql(self,types=None,data = {}):
516
+ """生成sql语句"""
517
+ if types==None:
518
+ self.__sql="SELECT"
519
+ if self.__distinct and self.__field:
520
+ self.__sql=self.__sql+" DISTINCT"
521
+ if self.__alias:
522
+ self.__sql=self.__sql+" %s FROM %s %s" % (self.__field,self.__table,self.__alias)
523
+ else:
524
+ self.__sql=self.__sql+" %s FROM %s" % (self.__field,self.__table)
525
+ elif types=='count':
526
+ self.__sql="SELECT COUNT(%s) FROM %s" % (self.__field,self.__table)
527
+ elif types=='max':
528
+ self.__sql="SELECT MAX(%s) FROM %s" % (self.__field,self.__table)
529
+ elif types=='min':
530
+ self.__sql="SELECT MIN(%s) FROM %s" % (self.__field,self.__table)
531
+ elif types=='avg':
532
+ self.__sql="SELECT AVG(%s) FROM %s" % (self.__field,self.__table)
533
+ elif types=='sum':
534
+ self.__sql="SELECT SUM(%s) FROM %s" % (self.__field,self.__table)
535
+ elif types=='update':
536
+ strs=''
537
+ for k in data:
538
+ if isinstance(data[k],str):
539
+ strs=strs+" %s = '%s' ," % (k,self.escape_string(data[k]))
540
+ else:
541
+ strs=strs+" %s = %s ," % (k,data[k])
542
+ strs=strs[:-1]
543
+ self.__sql="UPDATE %s SET %s" % (self.__table,strs)
544
+ # print(self.__sql)
545
+ elif types=='delete':
546
+ self.__sql="DELETE FROM %s" % (self.__table)
547
+ elif types=='insert':
548
+ if isinstance(data,dict):
549
+ strs=''
550
+ val=''
551
+ for k in data:
552
+ strs=strs+"%s," % k
553
+ if isinstance(data[k],str):
554
+ val=val+"'%s'," % self.escape_string(data[k])
555
+ else:
556
+ val=val+"%s," % data[k]
557
+ strs=strs[:-1]
558
+ val=val[:-1]
559
+ self.__sql="INSERT INTO "+str(self.__table)+" ("+strs+") VALUES ("+val+")"
560
+ # print(self.__sql)
561
+ elif isinstance(data,list):
562
+ strs=''
563
+ val='('
564
+ for k in data[0]:
565
+ strs=strs+" , "+k
566
+ for k in data:
567
+ for j in k:
568
+ if isinstance(k[j],str):
569
+ val=val+"'"+str(k[j])+"',"
570
+ else:
571
+ val=val+str(k[j])+","
572
+ val=val[:-1]
573
+ val=val+"),("
574
+ val=val[:-2]
575
+ self.__sql="INSERT INTO "+str(self.__table)+" ("+strs[3:]+") VALUES "+val
576
+
577
+ if self.__joinstr:
578
+ # print(self.__sql)
579
+ self.__sql=self.__sql+" "+self.__joinstr
580
+ if self.__where:
581
+ if isinstance(self.__where,str):
582
+ if self.__wheres:
583
+ if len(self.__wheres) == 2:
584
+ if isinstance(self.__wheres[1],list):
585
+ self.__sql=self.__sql + " WHERE %s %s (" % (self.__where,self.__operator(self.__wheres[0]))
586
+ for k in self.__wheres[1]:
587
+ self.__sql=self.__sql+str(k)+","
588
+ self.__sql=self.__sql[:-1]+")"
589
+ else:
590
+ self.__sql=self.__sql + " WHERE %s %s '%s'" % (self.__where,self.__operator(self.__wheres[0]),self.__wheres[1])
591
+ elif len(self.__wheres) > 2:
592
+ if self.__wheres[0]=='in':
593
+ strs=str(self.__wheres[1])
594
+ i=0
595
+ for k in self.__wheres:
596
+ if i > 1:
597
+ strs=strs+","+str(k)
598
+ i=i+1
599
+ self.__sql=self.__sql + " WHERE %s in (%s)" % (self.__where,strs)
600
+ else:
601
+ self.__sql=self.__sql + " WHERE %s = '%s'" % (self.__where,self.__wheres[0])
602
+ else:
603
+ self.__sql=self.__sql + " WHERE %s" % self.__where
604
+ elif isinstance(self.__where,list):
605
+ self.__sql=self.__sql + " WHERE %s" % self.__listTrans()
606
+ else:
607
+ print("参数where类型错误",type(self.__where),self.__where)
608
+ if self.__order:
609
+ s=''
610
+ if isinstance(self.__order,list):
611
+ for strs in self.__order:
612
+ if isinstance(strs,str):
613
+ s=s+strs+","
614
+ else:
615
+ pass
616
+ for key in strs:
617
+ s=s+key+" "+strs[key]
618
+ s=s+","
619
+ s=s[:-1]
620
+ if isinstance(self.__order,str):
621
+ if self.__order1:
622
+ if len(self.__order1) > 1:
623
+ if self.__order1[len(self.__order1)-1] == 'desc' or self.__order1[len(self.__order1)-1] == 'asc':
624
+ i=0
625
+ while i<len(self.__order1)-1:
626
+ s=s+self.__order1[i]+","
627
+ i=i+1
628
+ s=s[:-1]+" "+self.__order1[len(self.__order1)-1]
629
+ else:
630
+ for key in self.__order1:
631
+ s=s+key+","
632
+ s=s[:-1]
633
+ s=s+" asc"
634
+ s=self.__order+","+s
635
+ else:
636
+ s=s[:-1]+self.__order1[0]
637
+ s=self.__order+" "+s
638
+ else:
639
+ s=self.__order
640
+ # print(s)
641
+ self.__sql=self.__sql+" ORDER BY "+s
642
+ if self.__group:
643
+ s=self.__group
644
+ if self.__group1:
645
+ for key in self.__group1:
646
+ s=s+","+key
647
+ self.__sql=self.__sql+" GROUP BY "+s
648
+ if self.__having:
649
+ self.__sql=self.__sql+" HAVING "+self.__having
650
+ if self.__limit:
651
+ if self.__limit[1]:
652
+ self.__sql=self.__sql+" LIMIT %d,%d" % (self.__limit[0],self.__limit[1])
653
+ else:
654
+ self.__sql=self.__sql+" LIMIT %d" % self.__limit[0]
655
+ if self.__lock:
656
+ if isinstance(self.__lock,str):
657
+ self.__sql=self.__sql+" "+self.__lock
658
+ else:
659
+ self.__sql=self.__sql+' Exclusive lock'
660
+ # print(self.__sql)
661
+ def __listTrans(self):
662
+ """列表转换sql表达式
663
+ 返回 字符串
664
+ """
665
+ strs=''
666
+ #[('id', 'eq', '1'), 'or', ('id', 'eq', '2')]
667
+ for k in self.__where:
668
+ if isinstance(k,tuple):
669
+ t=0
670
+ for j in k:
671
+ if t==0:
672
+ strs=strs+' '+str(j)+' '
673
+ elif t==1:
674
+ strs=strs+self.__operator(j)
675
+ if t==2:
676
+ strs=strs+' "'+str(j)+'" '
677
+ t=t+1
678
+ elif isinstance(k,str):
679
+ strs=strs+k
680
+ return "("+strs+")"
681
+ def __operator(self,strs):
682
+ """运算符转换
683
+ 参数 strs 待转的字符串
684
+ 返回 已转换的运算符
685
+
686
+ 符号定义
687
+ eq 等于
688
+ neq 不等于
689
+ gt 大于
690
+ egt 大于等于
691
+ lt 小于
692
+ elt 小于等于
693
+ like LIKE
694
+ """
695
+ strss=strs.upper()
696
+ if strss == 'EQ':
697
+ k='='
698
+ elif strss == 'NEQ':
699
+ k='<>'
700
+ elif strss == 'GT':
701
+ k='>'
702
+ elif strss == 'EGT':
703
+ k='>='
704
+ elif strss == 'LT':
705
+ k='<'
706
+ elif strss == 'ELT':
707
+ k='<='
708
+ elif strss == 'LIKE':
709
+ k='LIKE'
710
+ else:
711
+ k=strss
712
+ return k
713
+ def escape_string(self,value):
714
+ """sqlite3 字符串转义
715
+
716
+ Value 字符串
717
+ """
718
+ # value = value.replace('/', '//')
719
+ value = value.replace("'", "''")
720
+ # value = value.replace('[', '/[')
721
+ # value = value.replace(']', '/]')
722
+ # value = value.replace('%', '/%')
723
+ # value = value.replace('&', '/&')
724
+ # value = value.replace('_', '/_')
725
+ # value = value.replace('(', '/(')
726
+ # value = value.replace(')', '/)')
727
+ return value
728
+
729
+
730
+
@@ -0,0 +1,13 @@
1
+ Metadata-Version: 1.2
2
+ Name: kcsqlite
3
+ Version: 1.0
4
+ Summary: kcsqlite
5
+ Home-page: UNKNOWN
6
+ Author: 百里
7
+ Author-email: kcwebs@kwebapp.cn
8
+ Maintainer: 坤坤
9
+ Maintainer-email: fk1402936534@qq.com
10
+ License: MIT License
11
+ Description: UNKNOWN
12
+ Keywords: kcsqlite1.0
13
+ Platform: UNKNOWN
@@ -0,0 +1,7 @@
1
+ setup.py
2
+ kcsqlite/__init__.py
3
+ kcsqlite/sqliteclass.py
4
+ kcsqlite.egg-info/PKG-INFO
5
+ kcsqlite.egg-info/SOURCES.txt
6
+ kcsqlite.egg-info/dependency_links.txt
7
+ kcsqlite.egg-info/top_level.txt
@@ -0,0 +1 @@
1
+ kcsqlite
kcsqlite-1.0/setup.cfg ADDED
@@ -0,0 +1,4 @@
1
+ [egg_info]
2
+ tag_build =
3
+ tag_date = 0
4
+
kcsqlite-1.0/setup.py ADDED
@@ -0,0 +1,56 @@
1
+
2
+ # 打包上传 python setup.py sdist upload
3
+ # 打包并安装 python setup.py sdist install
4
+ # twine upload --repository-url https://test.pypi.org/legacy/ dist/* #上传到测试
5
+ # pip install --index-url https://pypi.org/simple/ kcwebs #安装测试服务上的kcwebs pip3 install kcwebs==4.12.4 -i https://pypi.org/simple/
6
+ # 安装 python setup.py install
7
+ ############################################# pip3.8 install kcwebs==6.4.15 -i https://pypi.org/simple
8
+ import os,sys
9
+ from setuptools import setup
10
+ from kcsqlite import __version__
11
+ confkcws={}
12
+ confkcws['name']='kcsqlite'
13
+ confkcws['version']=__version__
14
+ confkcws['description']='kcsqlite'
15
+ confkcws['long_description']=''
16
+ confkcws['license']='MIT License'
17
+ confkcws['url']=''
18
+ confkcws['author']='百里'
19
+ confkcws['author_email']='kcwebs@kwebapp.cn'
20
+ confkcws['maintainer']='坤坤'
21
+ confkcws['maintainer_email']='fk1402936534@qq.com'
22
+ def get_file(folder='./',lists=[]):
23
+ lis=os.listdir(folder)
24
+ for files in lis:
25
+ if not os.path.isfile(folder+"/"+files):
26
+ if files=='__pycache__' or files=='.git':
27
+ pass
28
+ else:
29
+ lists.append(folder+"/"+files)
30
+ get_file(folder+"/"+files,lists)
31
+ else:
32
+ pass
33
+ return lists
34
+ def start():
35
+ b=get_file("kcsqlite",['kcsqlite'])
36
+ setup(
37
+ name = confkcws["name"],
38
+ version = confkcws["version"],
39
+ keywords = "kcsqlite"+confkcws['version'],
40
+ description = confkcws["description"],
41
+ long_description = confkcws["long_description"],
42
+ license = confkcws["license"],
43
+ author = confkcws["author"],
44
+ author_email = confkcws["author_email"],
45
+ maintainer = confkcws["maintainer"],
46
+ maintainer_email = confkcws["maintainer_email"],
47
+ url=confkcws['url'],
48
+ packages = b,
49
+
50
+
51
+ install_requires = [], #第三方包
52
+ package_data = {
53
+ '': ['*.html', '*.js','*.css','*.jpg','*.png','*.gif'],
54
+ }
55
+ )
56
+ start()