re-common 10.0.39__py3-none-any.whl → 10.0.41__py3-none-any.whl
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.
- re_common/baselibrary/__init__.py +4 -4
- re_common/baselibrary/baseabs/__init__.py +6 -6
- re_common/baselibrary/baseabs/baseabs.py +26 -26
- re_common/baselibrary/database/mbuilder.py +132 -132
- re_common/baselibrary/database/moudle.py +93 -93
- re_common/baselibrary/database/msqlite3.py +194 -194
- re_common/baselibrary/database/mysql.py +169 -169
- re_common/baselibrary/database/sql_factory.py +26 -26
- re_common/baselibrary/mthread/MThreadingRun.py +486 -486
- re_common/baselibrary/mthread/MThreadingRunEvent.py +349 -349
- re_common/baselibrary/mthread/__init__.py +2 -2
- re_common/baselibrary/mthread/mythreading.py +695 -695
- re_common/baselibrary/pakge_other/socks.py +404 -404
- re_common/baselibrary/readconfig/config_factory.py +18 -18
- re_common/baselibrary/readconfig/ini_config.py +317 -317
- re_common/baselibrary/readconfig/toml_config.py +49 -49
- re_common/baselibrary/temporary/envdata.py +36 -36
- re_common/baselibrary/tools/all_requests/aiohttp_request.py +118 -118
- re_common/baselibrary/tools/all_requests/httpx_requet.py +102 -102
- re_common/baselibrary/tools/all_requests/mrequest.py +412 -412
- re_common/baselibrary/tools/all_requests/requests_request.py +81 -81
- re_common/baselibrary/tools/batch_compre/bijiao_batch.py +31 -31
- re_common/baselibrary/tools/contrast_db3.py +123 -123
- re_common/baselibrary/tools/copy_file.py +39 -39
- re_common/baselibrary/tools/db3_2_sizedb3.py +102 -102
- re_common/baselibrary/tools/foreachgz.py +39 -39
- re_common/baselibrary/tools/get_attr.py +10 -10
- re_common/baselibrary/tools/image_to_pdf.py +61 -61
- re_common/baselibrary/tools/java_code_deal.py +139 -139
- re_common/baselibrary/tools/javacode.py +79 -79
- re_common/baselibrary/tools/mdb_db3.py +48 -48
- re_common/baselibrary/tools/merge_file.py +171 -171
- re_common/baselibrary/tools/merge_gz_file.py +165 -165
- re_common/baselibrary/tools/mhdfstools/down_hdfs_files.py +42 -42
- re_common/baselibrary/tools/mhdfstools/hdfst.py +42 -42
- re_common/baselibrary/tools/mhdfstools/up_hdfs_files.py +38 -38
- re_common/baselibrary/tools/mongo_tools.py +50 -50
- re_common/baselibrary/tools/move_file.py +170 -170
- re_common/baselibrary/tools/move_mongo/mongo_table_to_file.py +63 -63
- re_common/baselibrary/tools/move_mongo/move_mongo_table.py +354 -354
- re_common/baselibrary/tools/move_mongo/use_mttf.py +18 -18
- re_common/baselibrary/tools/move_mongo/use_mv.py +93 -93
- re_common/baselibrary/tools/mpandas/mpandasreadexcel.py +125 -125
- re_common/baselibrary/tools/mpandas/pandas_visualization.py +7 -7
- re_common/baselibrary/tools/myparsel.py +104 -104
- re_common/baselibrary/tools/rename_dir_file.py +37 -37
- re_common/baselibrary/tools/sequoiadb_utils.py +398 -398
- re_common/baselibrary/tools/split_line_to_many.py +25 -25
- re_common/baselibrary/tools/stringtodicts.py +33 -33
- re_common/baselibrary/tools/workwechant_bot.py +84 -84
- re_common/baselibrary/utils/baseaiohttp.py +296 -296
- re_common/baselibrary/utils/baseaiomysql.py +87 -87
- re_common/baselibrary/utils/baseallstep.py +191 -191
- re_common/baselibrary/utils/baseavro.py +19 -19
- re_common/baselibrary/utils/baseboto3.py +291 -291
- re_common/baselibrary/utils/basecsv.py +32 -32
- re_common/baselibrary/utils/basedict.py +133 -133
- re_common/baselibrary/utils/basedir.py +241 -241
- re_common/baselibrary/utils/baseencode.py +351 -351
- re_common/baselibrary/utils/baseencoding.py +28 -28
- re_common/baselibrary/utils/baseesdsl.py +86 -86
- re_common/baselibrary/utils/baseexcel.py +264 -264
- re_common/baselibrary/utils/baseexcept.py +109 -109
- re_common/baselibrary/utils/basefile.py +654 -654
- re_common/baselibrary/utils/baseftp.py +214 -214
- re_common/baselibrary/utils/basegzip.py +60 -60
- re_common/baselibrary/utils/basehdfs.py +135 -135
- re_common/baselibrary/utils/basehttpx.py +268 -268
- re_common/baselibrary/utils/baseip.py +87 -87
- re_common/baselibrary/utils/basejson.py +2 -2
- re_common/baselibrary/utils/baselist.py +32 -32
- re_common/baselibrary/utils/basemotor.py +190 -190
- re_common/baselibrary/utils/basemssql.py +98 -98
- re_common/baselibrary/utils/baseodbc.py +113 -113
- re_common/baselibrary/utils/basepandas.py +302 -302
- re_common/baselibrary/utils/basepeewee.py +11 -11
- re_common/baselibrary/utils/basepika.py +180 -180
- re_common/baselibrary/utils/basepydash.py +143 -143
- re_common/baselibrary/utils/basepymongo.py +230 -230
- re_common/baselibrary/utils/basequeue.py +22 -22
- re_common/baselibrary/utils/baserar.py +57 -57
- re_common/baselibrary/utils/baserequest.py +279 -279
- re_common/baselibrary/utils/baseset.py +8 -8
- re_common/baselibrary/utils/basesmb.py +403 -403
- re_common/baselibrary/utils/basestring.py +382 -382
- re_common/baselibrary/utils/basetime.py +320 -320
- re_common/baselibrary/utils/baseurl.py +121 -121
- re_common/baselibrary/utils/basezip.py +57 -57
- re_common/baselibrary/utils/core/__init__.py +7 -7
- re_common/baselibrary/utils/core/bottomutils.py +18 -18
- re_common/baselibrary/utils/core/mdeprecated.py +327 -327
- re_common/baselibrary/utils/core/mlamada.py +16 -16
- re_common/baselibrary/utils/core/msginfo.py +25 -25
- re_common/baselibrary/utils/core/requests_core.py +103 -103
- re_common/baselibrary/utils/fateadm.py +429 -429
- re_common/baselibrary/utils/importfun.py +123 -123
- re_common/baselibrary/utils/mfaker.py +57 -57
- re_common/baselibrary/utils/my_abc/__init__.py +3 -3
- re_common/baselibrary/utils/my_abc/better_abc.py +32 -32
- re_common/baselibrary/utils/mylogger.py +414 -414
- re_common/baselibrary/utils/myredisclient.py +861 -861
- re_common/baselibrary/utils/pipupgrade.py +21 -21
- re_common/baselibrary/utils/ringlist.py +85 -85
- re_common/baselibrary/utils/version_compare.py +36 -36
- re_common/baselibrary/utils/ydmhttp.py +126 -126
- re_common/facade/lazy_import.py +11 -11
- re_common/facade/loggerfacade.py +25 -25
- re_common/facade/mysqlfacade.py +467 -467
- re_common/facade/now.py +31 -31
- re_common/facade/sqlite3facade.py +257 -257
- re_common/facade/use/mq_use_facade.py +83 -83
- re_common/facade/use/proxy_use_facade.py +19 -19
- re_common/libtest/base_dict_test.py +19 -19
- re_common/libtest/baseavro_test.py +13 -13
- re_common/libtest/basefile_test.py +14 -14
- re_common/libtest/basemssql_test.py +77 -77
- re_common/libtest/baseodbc_test.py +7 -7
- re_common/libtest/basepandas_test.py +38 -38
- re_common/libtest/get_attr_test/get_attr_test_settings.py +14 -14
- re_common/libtest/get_attr_test/settings.py +54 -54
- re_common/libtest/idencode_test.py +53 -53
- re_common/libtest/iniconfig_test.py +35 -35
- re_common/libtest/ip_test.py +34 -34
- re_common/libtest/merge_file_test.py +20 -20
- re_common/libtest/mfaker_test.py +8 -8
- re_common/libtest/mm3_test.py +31 -31
- re_common/libtest/mylogger_test.py +88 -88
- re_common/libtest/myparsel_test.py +27 -27
- re_common/libtest/mysql_test.py +151 -151
- re_common/libtest/pymongo_test.py +21 -21
- re_common/libtest/split_test.py +11 -11
- re_common/libtest/sqlite3_merge_test.py +5 -5
- re_common/libtest/sqlite3_test.py +34 -34
- re_common/libtest/tomlconfig_test.py +30 -30
- re_common/libtest/use_tools_test/__init__.py +2 -2
- re_common/libtest/user/__init__.py +4 -4
- re_common/studio/__init__.py +4 -4
- re_common/studio/assignment_expressions.py +36 -36
- re_common/studio/mydash/test1.py +18 -18
- re_common/studio/pydashstudio/first.py +9 -9
- re_common/studio/streamlitstudio/first_app.py +65 -65
- re_common/studio/streamlitstudio/uber_pickups.py +23 -23
- re_common/studio/test.py +18 -18
- re_common/v2/baselibrary/business_utils/BusinessStringUtil.py +235 -220
- re_common/v2/baselibrary/business_utils/baseencodeid.py +100 -100
- re_common/v2/baselibrary/business_utils/full_doi_path.py +116 -116
- re_common/v2/baselibrary/business_utils/rel_tools.py +6 -6
- re_common/v2/baselibrary/decorators/utils.py +59 -59
- re_common/v2/baselibrary/helpers/search_packge/NearestNeighbors_test.py +105 -105
- re_common/v2/baselibrary/helpers/search_packge/fit_text_match.py +253 -253
- re_common/v2/baselibrary/helpers/search_packge/scikit_learn_text_matcher.py +260 -260
- re_common/v2/baselibrary/helpers/search_packge/test.py +1 -1
- re_common/v2/baselibrary/s3object/baseboto3.py +230 -230
- re_common/v2/baselibrary/tools/WeChatRobot.py +95 -95
- re_common/v2/baselibrary/tools/ac_ahocorasick.py +75 -75
- re_common/v2/baselibrary/tools/concurrency.py +35 -35
- re_common/v2/baselibrary/tools/data_processer/base.py +53 -53
- re_common/v2/baselibrary/tools/data_processer/data_processer.py +497 -508
- re_common/v2/baselibrary/tools/data_processer/data_reader.py +187 -187
- re_common/v2/baselibrary/tools/data_processer/data_writer.py +38 -38
- re_common/v2/baselibrary/tools/dict_tools.py +44 -44
- re_common/v2/baselibrary/tools/dolphinscheduler.py +187 -187
- re_common/v2/baselibrary/tools/hdfs_base_processor.py +204 -204
- re_common/v2/baselibrary/tools/hdfs_bulk_processor.py +67 -67
- re_common/v2/baselibrary/tools/hdfs_data_processer.py +338 -338
- re_common/v2/baselibrary/tools/hdfs_line_processor.py +74 -74
- re_common/v2/baselibrary/tools/list_tools.py +69 -69
- re_common/v2/baselibrary/tools/resume_tracker.py +94 -94
- re_common/v2/baselibrary/tools/search_hash_tools.py +54 -54
- re_common/v2/baselibrary/tools/text_matcher.py +326 -326
- re_common/v2/baselibrary/tools/tree_processor/__init__.py +0 -0
- re_common/v2/baselibrary/tools/tree_processor/builder.py +25 -0
- re_common/v2/baselibrary/tools/tree_processor/node.py +13 -0
- re_common/v2/baselibrary/tools/unionfind_tools.py +60 -60
- re_common/v2/baselibrary/utils/BusinessStringUtil.py +196 -196
- re_common/v2/baselibrary/utils/api_net_utils.py +270 -270
- re_common/v2/baselibrary/utils/author_smi.py +361 -361
- re_common/v2/baselibrary/utils/base_string_similarity.py +158 -158
- re_common/v2/baselibrary/utils/basedict.py +37 -37
- re_common/v2/baselibrary/utils/basehdfs.py +163 -163
- re_common/v2/baselibrary/utils/basepika.py +180 -180
- re_common/v2/baselibrary/utils/basetime.py +94 -77
- re_common/v2/baselibrary/utils/db.py +174 -156
- re_common/v2/baselibrary/utils/elasticsearch.py +46 -0
- re_common/v2/baselibrary/utils/json_cls.py +16 -16
- re_common/v2/baselibrary/utils/mq.py +83 -83
- re_common/v2/baselibrary/utils/n_ary_expression_tree.py +243 -243
- re_common/v2/baselibrary/utils/string_bool.py +187 -186
- re_common/v2/baselibrary/utils/string_clear.py +246 -246
- re_common/v2/baselibrary/utils/string_smi.py +18 -18
- re_common/v2/baselibrary/utils/stringutils.py +312 -271
- re_common/vip/base_step_process.py +11 -11
- re_common/vip/baseencodeid.py +90 -90
- re_common/vip/changetaskname.py +28 -28
- re_common/vip/core_var.py +24 -24
- re_common/vip/mmh3Hash.py +89 -89
- re_common/vip/proxy/allproxys.py +127 -127
- re_common/vip/proxy/allproxys_thread.py +159 -159
- re_common/vip/proxy/cnki_proxy.py +153 -153
- re_common/vip/proxy/kuaidaili.py +87 -87
- re_common/vip/proxy/proxy_all.py +113 -113
- re_common/vip/proxy/update_kuaidaili_0.py +42 -42
- re_common/vip/proxy/wanfang_proxy.py +152 -152
- re_common/vip/proxy/wp_proxy_all.py +181 -181
- re_common/vip/read_rawid_to_txt.py +91 -91
- re_common/vip/title/__init__.py +5 -5
- re_common/vip/title/transform/TransformBookTitleToZt.py +125 -125
- re_common/vip/title/transform/TransformConferenceTitleToZt.py +139 -139
- re_common/vip/title/transform/TransformCstadTitleToZt.py +195 -195
- re_common/vip/title/transform/TransformJournalTitleToZt.py +203 -203
- re_common/vip/title/transform/TransformPatentTitleToZt.py +132 -132
- re_common/vip/title/transform/TransformRegulationTitleToZt.py +114 -114
- re_common/vip/title/transform/TransformStandardTitleToZt.py +135 -135
- re_common/vip/title/transform/TransformThesisTitleToZt.py +135 -135
- re_common/vip/title/transform/__init__.py +10 -10
- {re_common-10.0.39.dist-info → re_common-10.0.41.dist-info}/LICENSE +201 -201
- {re_common-10.0.39.dist-info → re_common-10.0.41.dist-info}/METADATA +16 -16
- re_common-10.0.41.dist-info/RECORD +252 -0
- {re_common-10.0.39.dist-info → re_common-10.0.41.dist-info}/WHEEL +1 -1
- re_common-10.0.39.dist-info/RECORD +0 -248
- {re_common-10.0.39.dist-info → re_common-10.0.41.dist-info}/top_level.txt +0 -0
|
@@ -1,169 +1,169 @@
|
|
|
1
|
-
import pymysql
|
|
2
|
-
|
|
3
|
-
from re_common.baselibrary.database.moudle import SqlMoudle
|
|
4
|
-
from re_common.baselibrary.database.sql_factory import SqlFactory
|
|
5
|
-
from re_common.baselibrary.utils.version_compare import compare_bool
|
|
6
|
-
|
|
7
|
-
_json_escape_table = [chr(x) for x in range(128)]
|
|
8
|
-
_json_escape_table[0] = "\\0"
|
|
9
|
-
_json_escape_table[ord("\\")] = "\\\\"
|
|
10
|
-
_json_escape_table[ord("\n")] = "\\n"
|
|
11
|
-
_json_escape_table[ord("\r")] = "\\r"
|
|
12
|
-
_json_escape_table[ord("\032")] = "\\Z"
|
|
13
|
-
_json_escape_table[ord('"')] = '\\"'
|
|
14
|
-
_json_escape_table[ord("'")] = "\'"
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
class Mysql(SqlFactory):
|
|
18
|
-
|
|
19
|
-
@property
|
|
20
|
-
def db(self):
|
|
21
|
-
# 就是conn
|
|
22
|
-
if not self.is_ping():
|
|
23
|
-
assert self._mysqlmoudle, AttributeError("MySQL model不存在 无法重新连接 请设置moudle")
|
|
24
|
-
self.reConnect()
|
|
25
|
-
return self._db # type: pymysql.cursors.Cursor
|
|
26
|
-
|
|
27
|
-
@db.setter
|
|
28
|
-
def db(self, value):
|
|
29
|
-
self._db = value
|
|
30
|
-
|
|
31
|
-
@property
|
|
32
|
-
def cursor(self):
|
|
33
|
-
if self._cursor.connection:
|
|
34
|
-
return self._cursor # type: pymysql.cursors.Cursor
|
|
35
|
-
else:
|
|
36
|
-
self._cursor = self._db.cursor()
|
|
37
|
-
return self._cursor
|
|
38
|
-
|
|
39
|
-
@cursor.setter
|
|
40
|
-
def cursor(self, value):
|
|
41
|
-
self._cursor = value
|
|
42
|
-
|
|
43
|
-
@property
|
|
44
|
-
def mysqlmoudle(self):
|
|
45
|
-
return self._mysqlmoudle # type: SqlMoudle
|
|
46
|
-
|
|
47
|
-
@mysqlmoudle.setter
|
|
48
|
-
def mysqlmoudle(self, moudle):
|
|
49
|
-
self._mysqlmoudle = moudle
|
|
50
|
-
|
|
51
|
-
def get_new_cursor(self):
|
|
52
|
-
"""
|
|
53
|
-
获取一个新的游标
|
|
54
|
-
:return:
|
|
55
|
-
"""
|
|
56
|
-
# 检查db的存在及是否断掉 不知道为什么 不可以加括号 但编辑器会警告
|
|
57
|
-
return self._db.cursor()
|
|
58
|
-
|
|
59
|
-
def link(self, mysqlmoudle: SqlMoudle):
|
|
60
|
-
"""
|
|
61
|
-
连接数据库
|
|
62
|
-
:param mysqlmoudle:
|
|
63
|
-
:return:
|
|
64
|
-
"""
|
|
65
|
-
self._mysqlmoudle = mysqlmoudle
|
|
66
|
-
# 返回连接对象
|
|
67
|
-
self._db = pymysql.connect(**mysqlmoudle.to_dict())
|
|
68
|
-
self._cursor = self._db.cursor()
|
|
69
|
-
|
|
70
|
-
return self
|
|
71
|
-
|
|
72
|
-
def reConnect(self):
|
|
73
|
-
"""
|
|
74
|
-
重新连接数据库
|
|
75
|
-
:return:
|
|
76
|
-
"""
|
|
77
|
-
try:
|
|
78
|
-
self._db.ping()
|
|
79
|
-
self._db.close()
|
|
80
|
-
except:
|
|
81
|
-
self.link(self._mysqlmoudle)
|
|
82
|
-
self.link(self._mysqlmoudle)
|
|
83
|
-
|
|
84
|
-
def is_ping(self):
|
|
85
|
-
if self._db:
|
|
86
|
-
try:
|
|
87
|
-
return self._db.ping()
|
|
88
|
-
except:
|
|
89
|
-
self.link(self._mysqlmoudle)
|
|
90
|
-
else:
|
|
91
|
-
raise AttributeError("数据库连接对象不存在,请调用reConnect重新连接")
|
|
92
|
-
|
|
93
|
-
def commit(self):
|
|
94
|
-
"""
|
|
95
|
-
事务提交
|
|
96
|
-
:return:
|
|
97
|
-
"""
|
|
98
|
-
# 对象判断
|
|
99
|
-
assert isinstance(self._db, pymysql.connections.Connection)
|
|
100
|
-
self._db.commit()
|
|
101
|
-
|
|
102
|
-
def execute(self, sql, args=None):
|
|
103
|
-
"""
|
|
104
|
-
执行sql语句
|
|
105
|
-
:param sql:
|
|
106
|
-
:return:
|
|
107
|
-
"""
|
|
108
|
-
try:
|
|
109
|
-
assert isinstance(self._cursor, pymysql.cursors.Cursor)
|
|
110
|
-
# 游标是否被关闭,执行该函数保证有游标
|
|
111
|
-
self._cursor.execute(sql, args=args)
|
|
112
|
-
self.commit()
|
|
113
|
-
except Exception as e:
|
|
114
|
-
raise e
|
|
115
|
-
|
|
116
|
-
def fetchall(self):
|
|
117
|
-
"""
|
|
118
|
-
select 后调用获取全部返回结果
|
|
119
|
-
:return:
|
|
120
|
-
"""
|
|
121
|
-
result = self._cursor.fetchall()
|
|
122
|
-
return result
|
|
123
|
-
|
|
124
|
-
def close(self):
|
|
125
|
-
if self._db and isinstance(self._db, pymysql.connections.Connection):
|
|
126
|
-
self._db.close()
|
|
127
|
-
|
|
128
|
-
def rollback(self):
|
|
129
|
-
self.db.rollback()
|
|
130
|
-
|
|
131
|
-
@classmethod
|
|
132
|
-
def escape(cls, strings):
|
|
133
|
-
# 这个不能用于多线程,否则会出现多线程抢占连接
|
|
134
|
-
if compare_bool(pymysql.__version__, "1.0.0"):
|
|
135
|
-
from pymysql.converters import escape_string
|
|
136
|
-
return escape_string(strings)
|
|
137
|
-
else:
|
|
138
|
-
from pymysql import escape_string
|
|
139
|
-
return escape_string(strings)
|
|
140
|
-
|
|
141
|
-
def json_escape(self, strings):
|
|
142
|
-
"""
|
|
143
|
-
json化需要
|
|
144
|
-
:param strings:
|
|
145
|
-
:return:
|
|
146
|
-
"""
|
|
147
|
-
return strings.translate(_json_escape_table)
|
|
148
|
-
|
|
149
|
-
def __repr__(self):
|
|
150
|
-
return 'Mysql().link(%s)' % self._mysqlmoudle
|
|
151
|
-
|
|
152
|
-
def __str__(self):
|
|
153
|
-
return "Mysql %s" % self._mysqlmoudle
|
|
154
|
-
|
|
155
|
-
def __del__(self):
|
|
156
|
-
self.close()
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
def json_update(dicts):
|
|
160
|
-
duplicte_list = []
|
|
161
|
-
for k, v in dicts.items():
|
|
162
|
-
if isinstance(v, str):
|
|
163
|
-
duplicte_list.append(f"'$.{Mysql.escape(k)}','{Mysql.escape(v)}'")
|
|
164
|
-
else:
|
|
165
|
-
duplicte_list.append(f"'$.{Mysql.escape(k)}','{v}'")
|
|
166
|
-
duplicte = ",".join(duplicte_list)
|
|
167
|
-
# 处理 符合 %s 占位符里面的 正常数据非占位符存在 % 的情况
|
|
168
|
-
duplicte_format = duplicte.replace("%", "%%")
|
|
169
|
-
return duplicte_format
|
|
1
|
+
import pymysql
|
|
2
|
+
|
|
3
|
+
from re_common.baselibrary.database.moudle import SqlMoudle
|
|
4
|
+
from re_common.baselibrary.database.sql_factory import SqlFactory
|
|
5
|
+
from re_common.baselibrary.utils.version_compare import compare_bool
|
|
6
|
+
|
|
7
|
+
_json_escape_table = [chr(x) for x in range(128)]
|
|
8
|
+
_json_escape_table[0] = "\\0"
|
|
9
|
+
_json_escape_table[ord("\\")] = "\\\\"
|
|
10
|
+
_json_escape_table[ord("\n")] = "\\n"
|
|
11
|
+
_json_escape_table[ord("\r")] = "\\r"
|
|
12
|
+
_json_escape_table[ord("\032")] = "\\Z"
|
|
13
|
+
_json_escape_table[ord('"')] = '\\"'
|
|
14
|
+
_json_escape_table[ord("'")] = "\'"
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class Mysql(SqlFactory):
|
|
18
|
+
|
|
19
|
+
@property
|
|
20
|
+
def db(self):
|
|
21
|
+
# 就是conn
|
|
22
|
+
if not self.is_ping():
|
|
23
|
+
assert self._mysqlmoudle, AttributeError("MySQL model不存在 无法重新连接 请设置moudle")
|
|
24
|
+
self.reConnect()
|
|
25
|
+
return self._db # type: pymysql.cursors.Cursor
|
|
26
|
+
|
|
27
|
+
@db.setter
|
|
28
|
+
def db(self, value):
|
|
29
|
+
self._db = value
|
|
30
|
+
|
|
31
|
+
@property
|
|
32
|
+
def cursor(self):
|
|
33
|
+
if self._cursor.connection:
|
|
34
|
+
return self._cursor # type: pymysql.cursors.Cursor
|
|
35
|
+
else:
|
|
36
|
+
self._cursor = self._db.cursor()
|
|
37
|
+
return self._cursor
|
|
38
|
+
|
|
39
|
+
@cursor.setter
|
|
40
|
+
def cursor(self, value):
|
|
41
|
+
self._cursor = value
|
|
42
|
+
|
|
43
|
+
@property
|
|
44
|
+
def mysqlmoudle(self):
|
|
45
|
+
return self._mysqlmoudle # type: SqlMoudle
|
|
46
|
+
|
|
47
|
+
@mysqlmoudle.setter
|
|
48
|
+
def mysqlmoudle(self, moudle):
|
|
49
|
+
self._mysqlmoudle = moudle
|
|
50
|
+
|
|
51
|
+
def get_new_cursor(self):
|
|
52
|
+
"""
|
|
53
|
+
获取一个新的游标
|
|
54
|
+
:return:
|
|
55
|
+
"""
|
|
56
|
+
# 检查db的存在及是否断掉 不知道为什么 不可以加括号 但编辑器会警告
|
|
57
|
+
return self._db.cursor()
|
|
58
|
+
|
|
59
|
+
def link(self, mysqlmoudle: SqlMoudle):
|
|
60
|
+
"""
|
|
61
|
+
连接数据库
|
|
62
|
+
:param mysqlmoudle:
|
|
63
|
+
:return:
|
|
64
|
+
"""
|
|
65
|
+
self._mysqlmoudle = mysqlmoudle
|
|
66
|
+
# 返回连接对象
|
|
67
|
+
self._db = pymysql.connect(**mysqlmoudle.to_dict())
|
|
68
|
+
self._cursor = self._db.cursor()
|
|
69
|
+
|
|
70
|
+
return self
|
|
71
|
+
|
|
72
|
+
def reConnect(self):
|
|
73
|
+
"""
|
|
74
|
+
重新连接数据库
|
|
75
|
+
:return:
|
|
76
|
+
"""
|
|
77
|
+
try:
|
|
78
|
+
self._db.ping()
|
|
79
|
+
self._db.close()
|
|
80
|
+
except:
|
|
81
|
+
self.link(self._mysqlmoudle)
|
|
82
|
+
self.link(self._mysqlmoudle)
|
|
83
|
+
|
|
84
|
+
def is_ping(self):
|
|
85
|
+
if self._db:
|
|
86
|
+
try:
|
|
87
|
+
return self._db.ping()
|
|
88
|
+
except:
|
|
89
|
+
self.link(self._mysqlmoudle)
|
|
90
|
+
else:
|
|
91
|
+
raise AttributeError("数据库连接对象不存在,请调用reConnect重新连接")
|
|
92
|
+
|
|
93
|
+
def commit(self):
|
|
94
|
+
"""
|
|
95
|
+
事务提交
|
|
96
|
+
:return:
|
|
97
|
+
"""
|
|
98
|
+
# 对象判断
|
|
99
|
+
assert isinstance(self._db, pymysql.connections.Connection)
|
|
100
|
+
self._db.commit()
|
|
101
|
+
|
|
102
|
+
def execute(self, sql, args=None):
|
|
103
|
+
"""
|
|
104
|
+
执行sql语句
|
|
105
|
+
:param sql:
|
|
106
|
+
:return:
|
|
107
|
+
"""
|
|
108
|
+
try:
|
|
109
|
+
assert isinstance(self._cursor, pymysql.cursors.Cursor)
|
|
110
|
+
# 游标是否被关闭,执行该函数保证有游标
|
|
111
|
+
self._cursor.execute(sql, args=args)
|
|
112
|
+
self.commit()
|
|
113
|
+
except Exception as e:
|
|
114
|
+
raise e
|
|
115
|
+
|
|
116
|
+
def fetchall(self):
|
|
117
|
+
"""
|
|
118
|
+
select 后调用获取全部返回结果
|
|
119
|
+
:return:
|
|
120
|
+
"""
|
|
121
|
+
result = self._cursor.fetchall()
|
|
122
|
+
return result
|
|
123
|
+
|
|
124
|
+
def close(self):
|
|
125
|
+
if self._db and isinstance(self._db, pymysql.connections.Connection):
|
|
126
|
+
self._db.close()
|
|
127
|
+
|
|
128
|
+
def rollback(self):
|
|
129
|
+
self.db.rollback()
|
|
130
|
+
|
|
131
|
+
@classmethod
|
|
132
|
+
def escape(cls, strings):
|
|
133
|
+
# 这个不能用于多线程,否则会出现多线程抢占连接
|
|
134
|
+
if compare_bool(pymysql.__version__, "1.0.0"):
|
|
135
|
+
from pymysql.converters import escape_string
|
|
136
|
+
return escape_string(strings)
|
|
137
|
+
else:
|
|
138
|
+
from pymysql import escape_string
|
|
139
|
+
return escape_string(strings)
|
|
140
|
+
|
|
141
|
+
def json_escape(self, strings):
|
|
142
|
+
"""
|
|
143
|
+
json化需要
|
|
144
|
+
:param strings:
|
|
145
|
+
:return:
|
|
146
|
+
"""
|
|
147
|
+
return strings.translate(_json_escape_table)
|
|
148
|
+
|
|
149
|
+
def __repr__(self):
|
|
150
|
+
return 'Mysql().link(%s)' % self._mysqlmoudle
|
|
151
|
+
|
|
152
|
+
def __str__(self):
|
|
153
|
+
return "Mysql %s" % self._mysqlmoudle
|
|
154
|
+
|
|
155
|
+
def __del__(self):
|
|
156
|
+
self.close()
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
def json_update(dicts):
|
|
160
|
+
duplicte_list = []
|
|
161
|
+
for k, v in dicts.items():
|
|
162
|
+
if isinstance(v, str):
|
|
163
|
+
duplicte_list.append(f"'$.{Mysql.escape(k)}','{Mysql.escape(v)}'")
|
|
164
|
+
else:
|
|
165
|
+
duplicte_list.append(f"'$.{Mysql.escape(k)}','{v}'")
|
|
166
|
+
duplicte = ",".join(duplicte_list)
|
|
167
|
+
# 处理 符合 %s 占位符里面的 正常数据非占位符存在 % 的情况
|
|
168
|
+
duplicte_format = duplicte.replace("%", "%%")
|
|
169
|
+
return duplicte_format
|
|
@@ -1,26 +1,26 @@
|
|
|
1
|
-
from re_common.baselibrary.baseabs import BaseAbs
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
class SqlFactory(BaseAbs):
|
|
5
|
-
"""
|
|
6
|
-
sql 工厂类
|
|
7
|
-
"""
|
|
8
|
-
@staticmethod
|
|
9
|
-
def mysql_factory(type='mysql'):
|
|
10
|
-
if type == 'mysql':
|
|
11
|
-
"""
|
|
12
|
-
mysql类 返回一个mysql的对象
|
|
13
|
-
"""
|
|
14
|
-
from re_common.baselibrary.database.mysql import Mysql
|
|
15
|
-
return Mysql()
|
|
16
|
-
assert 0, "err sql type please check: %s" % type
|
|
17
|
-
|
|
18
|
-
@staticmethod
|
|
19
|
-
def sqlite_factory(type='sqlite3'):
|
|
20
|
-
if type == 'sqlite3':
|
|
21
|
-
"""
|
|
22
|
-
sqlite3类 返回一个sqlite3的对象
|
|
23
|
-
"""
|
|
24
|
-
from re_common.baselibrary.database.msqlite3 import Sqlite3
|
|
25
|
-
return Sqlite3()
|
|
26
|
-
assert 0, "err sqllite type please check: %s" % type
|
|
1
|
+
from re_common.baselibrary.baseabs import BaseAbs
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class SqlFactory(BaseAbs):
|
|
5
|
+
"""
|
|
6
|
+
sql 工厂类
|
|
7
|
+
"""
|
|
8
|
+
@staticmethod
|
|
9
|
+
def mysql_factory(type='mysql'):
|
|
10
|
+
if type == 'mysql':
|
|
11
|
+
"""
|
|
12
|
+
mysql类 返回一个mysql的对象
|
|
13
|
+
"""
|
|
14
|
+
from re_common.baselibrary.database.mysql import Mysql
|
|
15
|
+
return Mysql()
|
|
16
|
+
assert 0, "err sql type please check: %s" % type
|
|
17
|
+
|
|
18
|
+
@staticmethod
|
|
19
|
+
def sqlite_factory(type='sqlite3'):
|
|
20
|
+
if type == 'sqlite3':
|
|
21
|
+
"""
|
|
22
|
+
sqlite3类 返回一个sqlite3的对象
|
|
23
|
+
"""
|
|
24
|
+
from re_common.baselibrary.database.msqlite3 import Sqlite3
|
|
25
|
+
return Sqlite3()
|
|
26
|
+
assert 0, "err sqllite type please check: %s" % type
|