re-common 10.0.22__py3-none-any.whl → 10.0.24__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 +195 -0
- re_common/v2/baselibrary/business_utils/__init__.py +0 -0
- re_common/v2/baselibrary/business_utils/rel_tools.py +6 -0
- re_common/v2/baselibrary/decorators/utils.py +59 -59
- re_common/v2/baselibrary/s3object/baseboto3.py +230 -230
- re_common/v2/baselibrary/tools/WeChatRobot.py +95 -79
- re_common/v2/baselibrary/tools/ac_ahocorasick.py +75 -75
- re_common/v2/baselibrary/tools/dict_tools.py +37 -37
- re_common/v2/baselibrary/tools/dolphinscheduler.py +187 -187
- re_common/v2/baselibrary/tools/hdfs_data_processer.py +338 -338
- re_common/v2/baselibrary/tools/list_tools.py +65 -65
- 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/unionfind_tools.py +60 -60
- re_common/v2/baselibrary/utils/BusinessStringUtil.py +196 -196
- re_common/v2/baselibrary/utils/author_smi.py +360 -360
- 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 +161 -161
- re_common/v2/baselibrary/utils/basepika.py +180 -180
- re_common/v2/baselibrary/utils/basetime.py +77 -77
- re_common/v2/baselibrary/utils/db.py +38 -38
- 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 +186 -149
- re_common/v2/baselibrary/utils/string_clear.py +227 -204
- re_common/v2/baselibrary/utils/string_smi.py +18 -18
- re_common/v2/baselibrary/utils/stringutils.py +213 -213
- 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.22.dist-info → re_common-10.0.24.dist-info}/LICENSE +201 -201
- {re_common-10.0.22.dist-info → re_common-10.0.24.dist-info}/METADATA +16 -16
- re_common-10.0.24.dist-info/RECORD +230 -0
- {re_common-10.0.22.dist-info → re_common-10.0.24.dist-info}/WHEEL +1 -1
- re_common-10.0.22.dist-info/RECORD +0 -227
- {re_common-10.0.22.dist-info → re_common-10.0.24.dist-info}/top_level.txt +0 -0
re_common/facade/mysqlfacade.py
CHANGED
|
@@ -1,467 +1,467 @@
|
|
|
1
|
-
import sys
|
|
2
|
-
import traceback
|
|
3
|
-
|
|
4
|
-
import pymysql
|
|
5
|
-
|
|
6
|
-
from re_common.baselibrary import MLogger
|
|
7
|
-
from re_common.baselibrary.baseabs import BaseAbs
|
|
8
|
-
from re_common.baselibrary.database.mbuilder import MysqlBuilderAbstract
|
|
9
|
-
from re_common.baselibrary.database.moudle import SqlMoudle
|
|
10
|
-
from re_common.baselibrary.readconfig.ini_config import IniConfig
|
|
11
|
-
from re_common.baselibrary.readconfig.toml_config import TomlConfig
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
class MysqlBuilder(MysqlBuilderAbstract):
|
|
15
|
-
def __init__(self, configfile, configname, keytransformdicts=None):
|
|
16
|
-
# sql的moudle对象 mysql通过该对象对接参数
|
|
17
|
-
self.sqlmoudle = SqlMoudle()
|
|
18
|
-
# 获取配置文件对象
|
|
19
|
-
self.ic = IniConfig(configfile).builder()
|
|
20
|
-
# 配置文件位置
|
|
21
|
-
self.configfile = configfile
|
|
22
|
-
# 配置文件的sections
|
|
23
|
-
self.configname = configname
|
|
24
|
-
# 使用key转换器转换key(主要用于配置文件的key与我们默认读取时的key不一致)
|
|
25
|
-
self.keytransformdicts = keytransformdicts
|
|
26
|
-
"""
|
|
27
|
-
python2
|
|
28
|
-
self.config.readfp(open(configfile, 'rb'))
|
|
29
|
-
python3
|
|
30
|
-
self.config.read_file(open(configfile, 'r'))
|
|
31
|
-
"""
|
|
32
|
-
|
|
33
|
-
def build_port(self, port):
|
|
34
|
-
self.sqlmoudle.port = int(self.ic.get_value(self.configname, port))
|
|
35
|
-
return self
|
|
36
|
-
|
|
37
|
-
def build_server_address(self, host):
|
|
38
|
-
self.sqlmoudle.host = self.ic.get_value(self.configname, host)
|
|
39
|
-
return self
|
|
40
|
-
|
|
41
|
-
def build_password(self, passwd):
|
|
42
|
-
self.sqlmoudle.passwd = self.ic.get_value(self.configname, passwd)
|
|
43
|
-
return self
|
|
44
|
-
|
|
45
|
-
def use_db(self, db):
|
|
46
|
-
self.sqlmoudle.db = self.ic.get_value(self.configname, db)
|
|
47
|
-
return self
|
|
48
|
-
|
|
49
|
-
def build_username(self, user):
|
|
50
|
-
self.sqlmoudle.user = self.ic.get_value(self.configname, user)
|
|
51
|
-
return self
|
|
52
|
-
|
|
53
|
-
def build_chart(self, chartset):
|
|
54
|
-
self.sqlmoudle.charset = self.ic.get_value(self.configname, chartset)
|
|
55
|
-
return self
|
|
56
|
-
|
|
57
|
-
def build_cursorclass(self, cursornum):
|
|
58
|
-
if cursornum == 1:
|
|
59
|
-
self.sqlmoudle.cursorclass = pymysql.cursors.DictCursor
|
|
60
|
-
else:
|
|
61
|
-
# 默认保持不变
|
|
62
|
-
pass
|
|
63
|
-
|
|
64
|
-
return self
|
|
65
|
-
|
|
66
|
-
# def build_cursorclass(self,cursorclass):
|
|
67
|
-
# self.sqlmoudle.cursorclass = self.ic.get_value(self.configname, cursorclass)
|
|
68
|
-
|
|
69
|
-
def get_moudle(self):
|
|
70
|
-
"""
|
|
71
|
-
返回数据库连接需要的对象
|
|
72
|
-
:return:
|
|
73
|
-
"""
|
|
74
|
-
return self.sqlmoudle
|
|
75
|
-
|
|
76
|
-
def build_all(self):
|
|
77
|
-
if not self.keytransformdicts:
|
|
78
|
-
# 不传入时不转换
|
|
79
|
-
self.keytransformdicts = {"port": "port", "host": "host", "passwd": "passwd", "user": "user", "db": "db",
|
|
80
|
-
"chartset": "chartset"}
|
|
81
|
-
self.build_port(self.keytransformdicts["port"])
|
|
82
|
-
self.build_server_address(self.keytransformdicts["host"])
|
|
83
|
-
self.build_password(self.keytransformdicts["passwd"])
|
|
84
|
-
self.build_username(self.keytransformdicts["user"])
|
|
85
|
-
self.use_db(self.keytransformdicts["db"])
|
|
86
|
-
self.build_chart(self.keytransformdicts["chartset"])
|
|
87
|
-
return self
|
|
88
|
-
|
|
89
|
-
def get_tuples(self):
|
|
90
|
-
return self.sqlmoudle.host, self.sqlmoudle.user, self.sqlmoudle.passwd, self.sqlmoudle.port
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
class MysqlBuilderForToml(MysqlBuilderAbstract):
|
|
94
|
-
def __init__(self, configfile, sesc, keytransformdicts=None):
|
|
95
|
-
# sql的moudle对象 mysql通过该对象对接参数
|
|
96
|
-
self.sqlmoudle = SqlMoudle()
|
|
97
|
-
# 获取配置文件对象
|
|
98
|
-
self.dic = TomlConfig(configfile).read_file_remove_bom().get_dicts()
|
|
99
|
-
# 配置文件位置
|
|
100
|
-
self.configfile = configfile
|
|
101
|
-
# 配置文件的sections
|
|
102
|
-
self.sesc = sesc
|
|
103
|
-
# 使用key转换器转换key(主要用于配置文件的key与我们默认读取时的key不一致)
|
|
104
|
-
self.keytransformdicts = keytransformdicts
|
|
105
|
-
"""
|
|
106
|
-
python2
|
|
107
|
-
self.config.readfp(open(configfile, 'rb'))
|
|
108
|
-
python3
|
|
109
|
-
self.config.read_file(open(configfile, 'r'))
|
|
110
|
-
"""
|
|
111
|
-
|
|
112
|
-
def build_port(self, port):
|
|
113
|
-
self.sqlmoudle.port = int(self.dic[self.sesc][port])
|
|
114
|
-
return self
|
|
115
|
-
|
|
116
|
-
def build_server_address(self, host):
|
|
117
|
-
self.sqlmoudle.host = self.dic[self.sesc][host]
|
|
118
|
-
return self
|
|
119
|
-
|
|
120
|
-
def build_password(self, passwd):
|
|
121
|
-
self.sqlmoudle.passwd = self.dic[self.sesc][passwd]
|
|
122
|
-
return self
|
|
123
|
-
|
|
124
|
-
def use_db(self, db):
|
|
125
|
-
self.sqlmoudle.db = self.dic[self.sesc][db]
|
|
126
|
-
return self
|
|
127
|
-
|
|
128
|
-
def build_username(self, user):
|
|
129
|
-
self.sqlmoudle.user = self.dic[self.sesc][user]
|
|
130
|
-
return self
|
|
131
|
-
|
|
132
|
-
def build_chart(self, chartset):
|
|
133
|
-
self.sqlmoudle.charset = self.dic[self.sesc][chartset]
|
|
134
|
-
return self
|
|
135
|
-
|
|
136
|
-
def build_cursorclass(self, cursornum):
|
|
137
|
-
if cursornum == 1:
|
|
138
|
-
self.sqlmoudle.cursorclass = pymysql.cursors.DictCursor
|
|
139
|
-
else:
|
|
140
|
-
# 默认保持不变
|
|
141
|
-
pass
|
|
142
|
-
|
|
143
|
-
return self
|
|
144
|
-
|
|
145
|
-
def get_moudle(self):
|
|
146
|
-
"""
|
|
147
|
-
返回数据库连接需要的对象
|
|
148
|
-
:return:
|
|
149
|
-
"""
|
|
150
|
-
return self.sqlmoudle
|
|
151
|
-
|
|
152
|
-
def build_all(self):
|
|
153
|
-
if not self.keytransformdicts:
|
|
154
|
-
# 不传入时不转换
|
|
155
|
-
self.keytransformdicts = {"port": "port", "host": "host", "passwd": "passwd", "user": "user", "db": "db",
|
|
156
|
-
"chartset": "chartset"}
|
|
157
|
-
self.build_port(self.keytransformdicts["port"])
|
|
158
|
-
self.build_server_address(self.keytransformdicts["host"])
|
|
159
|
-
self.build_password(self.keytransformdicts["passwd"])
|
|
160
|
-
self.build_username(self.keytransformdicts["user"])
|
|
161
|
-
self.use_db(self.keytransformdicts["db"])
|
|
162
|
-
self.build_chart(self.keytransformdicts["chartset"])
|
|
163
|
-
return self
|
|
164
|
-
|
|
165
|
-
def get_tuples(self):
|
|
166
|
-
return self.sqlmoudle.host, self.sqlmoudle.user, self.sqlmoudle.passwd, self.sqlmoudle.port
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
class MysqlBuilderForDicts(MysqlBuilderAbstract):
|
|
170
|
-
def __init__(self, dicts, keytransformdicts=None):
|
|
171
|
-
# sql的moudle对象 mysql通过该对象对接参数
|
|
172
|
-
self.sqlmoudle = SqlMoudle()
|
|
173
|
-
self.dicts = dicts
|
|
174
|
-
# 使用key转换器转换key(主要用于配置文件的key与我们默认读取时的key不一致)
|
|
175
|
-
self.keytransformdicts = keytransformdicts
|
|
176
|
-
|
|
177
|
-
def build_port(self, port):
|
|
178
|
-
self.sqlmoudle.port = int(self.dicts[port])
|
|
179
|
-
return self
|
|
180
|
-
|
|
181
|
-
def build_server_address(self, host):
|
|
182
|
-
self.sqlmoudle.host = self.dicts[host]
|
|
183
|
-
return self
|
|
184
|
-
|
|
185
|
-
def build_password(self, passwd):
|
|
186
|
-
self.sqlmoudle.passwd = self.dicts[passwd]
|
|
187
|
-
return self
|
|
188
|
-
|
|
189
|
-
def use_db(self, db):
|
|
190
|
-
self.sqlmoudle.db = self.dicts[db]
|
|
191
|
-
return self
|
|
192
|
-
|
|
193
|
-
def build_username(self, user):
|
|
194
|
-
self.sqlmoudle.user = self.dicts[user]
|
|
195
|
-
return self
|
|
196
|
-
|
|
197
|
-
def build_chart(self, chartset):
|
|
198
|
-
self.sqlmoudle.charset = self.dicts[chartset]
|
|
199
|
-
return self
|
|
200
|
-
|
|
201
|
-
def build_cursorclass(self, cursornum):
|
|
202
|
-
if cursornum == 1:
|
|
203
|
-
self.sqlmoudle.cursorclass = pymysql.cursors.DictCursor
|
|
204
|
-
else:
|
|
205
|
-
# 默认保持不变
|
|
206
|
-
pass
|
|
207
|
-
|
|
208
|
-
return self
|
|
209
|
-
|
|
210
|
-
def get_moudle(self):
|
|
211
|
-
"""
|
|
212
|
-
返回数据库连接需要的对象
|
|
213
|
-
:return:
|
|
214
|
-
"""
|
|
215
|
-
return self.sqlmoudle
|
|
216
|
-
|
|
217
|
-
def build_all(self):
|
|
218
|
-
if not self.keytransformdicts:
|
|
219
|
-
# 不传入时不转换
|
|
220
|
-
self.keytransformdicts = {"port": "port", "host": "host", "passwd": "passwd", "user": "user", "db": "db",
|
|
221
|
-
"chartset": "chartset"}
|
|
222
|
-
self.build_port(self.keytransformdicts["port"])
|
|
223
|
-
self.build_server_address(self.keytransformdicts["host"])
|
|
224
|
-
self.build_password(self.keytransformdicts["passwd"])
|
|
225
|
-
self.build_username(self.keytransformdicts["user"])
|
|
226
|
-
self.use_db(self.keytransformdicts["db"])
|
|
227
|
-
self.build_chart(self.keytransformdicts["chartset"])
|
|
228
|
-
return self
|
|
229
|
-
|
|
230
|
-
def get_tuples(self):
|
|
231
|
-
return self.sqlmoudle.host, self.sqlmoudle.user, self.sqlmoudle.passwd, self.sqlmoudle.port
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
class MysqlUtiles(object):
|
|
235
|
-
def __init__(self, cfgfilepath, sesc, logger=None, keytransformdicts=None, builder="MysqlBuilder", cursorsnum=0,
|
|
236
|
-
dicts=None):
|
|
237
|
-
"""
|
|
238
|
-
|
|
239
|
-
:param cfgfilepath:
|
|
240
|
-
:param sesc:
|
|
241
|
-
:param logger:
|
|
242
|
-
:param keytransformdicts:
|
|
243
|
-
:param builder:
|
|
244
|
-
:param cursors: 0表示默认,1 表示dicts 其他情况后面再添加
|
|
245
|
-
"""
|
|
246
|
-
self._logger = logger
|
|
247
|
-
# 通过工厂方法获取mysql对象
|
|
248
|
-
self.mysql = BaseAbs.get_sql_factory().mysql_factory("mysql")
|
|
249
|
-
# mysql 连接通过builder进行适配 这里的builder通过配置文件获取相关连接信息
|
|
250
|
-
# 也可以通过继承 MysqlBuilderAbstract 后自己手动设置builer
|
|
251
|
-
if builder == "MysqlBuilder":
|
|
252
|
-
self.builder = MysqlBuilder(cfgfilepath, sesc, keytransformdicts)
|
|
253
|
-
elif builder == "MysqlBuilderForToml":
|
|
254
|
-
self.builder = MysqlBuilderForToml(cfgfilepath, sesc, keytransformdicts)
|
|
255
|
-
elif builder == "MysqlBuilderForDicts":
|
|
256
|
-
self.builder = MysqlBuilderForDicts(dicts, keytransformdicts)
|
|
257
|
-
else:
|
|
258
|
-
raise Exception("传入builder 参数有误")
|
|
259
|
-
self.builder = self.builder.build_all().build_cursorclass(cursorsnum)
|
|
260
|
-
self.moudle = self.builder.get_moudle()
|
|
261
|
-
# 连接mysql通过唯一适配moudle
|
|
262
|
-
# print(self.moudle.to_dict())
|
|
263
|
-
self.mysql.link(self.moudle)
|
|
264
|
-
|
|
265
|
-
@property
|
|
266
|
-
def logger(self):
|
|
267
|
-
if self._logger is None:
|
|
268
|
-
self._logger = MLogger().streamlogger
|
|
269
|
-
return self._logger
|
|
270
|
-
|
|
271
|
-
@logger.setter
|
|
272
|
-
def logger(self, value):
|
|
273
|
-
assert isinstance(value, MLogger)
|
|
274
|
-
self._logger = value
|
|
275
|
-
|
|
276
|
-
# 更新数据库状态
|
|
277
|
-
def ExeSqlListToDB(self, sSqlList, errExit=True, args=None):
|
|
278
|
-
"""
|
|
279
|
-
该函数处理一个sql列表 没有返回并将列表置空
|
|
280
|
-
:param sSqlList:
|
|
281
|
-
:return:
|
|
282
|
-
"""
|
|
283
|
-
dbMsg = None
|
|
284
|
-
if not self.mysql:
|
|
285
|
-
raise ValueError("database conn or database config must have to have one")
|
|
286
|
-
if not self.mysql.is_ping():
|
|
287
|
-
self.mysql.reConnect()
|
|
288
|
-
cursor = self.mysql.get_new_cursor()
|
|
289
|
-
errcount = 0
|
|
290
|
-
successcount = 0
|
|
291
|
-
for sql in sSqlList:
|
|
292
|
-
try:
|
|
293
|
-
self.logger.info(sql + ";" + str(args))
|
|
294
|
-
cursor.execute(sql, args=args)
|
|
295
|
-
successcount += 1
|
|
296
|
-
except:
|
|
297
|
-
errcount += 1
|
|
298
|
-
self.mysql.commit()
|
|
299
|
-
self.logger.error('*errSql:' + sql)
|
|
300
|
-
dbMsg = '*updateError:' + traceback.format_exc()
|
|
301
|
-
if errExit:
|
|
302
|
-
self.logger.error(dbMsg)
|
|
303
|
-
sys.exit(-1)
|
|
304
|
-
if dbMsg:
|
|
305
|
-
self.logger.error(dbMsg)
|
|
306
|
-
self.mysql.commit()
|
|
307
|
-
cursor.close()
|
|
308
|
-
if errcount:
|
|
309
|
-
return False, successcount, errcount
|
|
310
|
-
else:
|
|
311
|
-
return True, successcount, errcount
|
|
312
|
-
|
|
313
|
-
def SelectFromDB(self, sSql, errExit=True, args=None):
|
|
314
|
-
"""
|
|
315
|
-
使用sql语句查询并返回结果列表
|
|
316
|
-
:param sql:
|
|
317
|
-
:return:
|
|
318
|
-
"""
|
|
319
|
-
if not self.mysql:
|
|
320
|
-
raise ValueError("database conn or database config must have to have one")
|
|
321
|
-
if self.mysql.is_ping():
|
|
322
|
-
self.mysql.reConnect()
|
|
323
|
-
cursor = self.mysql.get_new_cursor()
|
|
324
|
-
try:
|
|
325
|
-
self.logger.info(sSql + ";" + str(args))
|
|
326
|
-
result = cursor.execute(sSql, args=args)
|
|
327
|
-
rows = cursor.fetchall()
|
|
328
|
-
return True, rows
|
|
329
|
-
except:
|
|
330
|
-
self.logger.error('* errSql:' + sSql)
|
|
331
|
-
sMsg = '* errSynax:' + traceback.format_exc()
|
|
332
|
-
if errExit:
|
|
333
|
-
self.logger.error(sMsg)
|
|
334
|
-
sys.exit(-1)
|
|
335
|
-
finally:
|
|
336
|
-
self.mysql.commit()
|
|
337
|
-
cursor.close()
|
|
338
|
-
if sMsg:
|
|
339
|
-
self.logger.error(sMsg)
|
|
340
|
-
return False, sMsg
|
|
341
|
-
|
|
342
|
-
def SelectFromDBFetchOne_noyield(self, sSql, errExit=True, args=None):
|
|
343
|
-
"""
|
|
344
|
-
使用sql语句查询并返回结果列表
|
|
345
|
-
:param sql:
|
|
346
|
-
:return:
|
|
347
|
-
"""
|
|
348
|
-
if not self.mysql:
|
|
349
|
-
raise ValueError("database conn or database config must have to have one")
|
|
350
|
-
if self.mysql.is_ping():
|
|
351
|
-
self.mysql.reConnect()
|
|
352
|
-
cur = self.mysql.get_new_cursor()
|
|
353
|
-
try:
|
|
354
|
-
self.logger.info(sSql + ";" + str(args))
|
|
355
|
-
result = cur.execute(sSql, args=args)
|
|
356
|
-
return True, cur.fetchone()
|
|
357
|
-
except:
|
|
358
|
-
self.logger.error('* errSql:' + sSql)
|
|
359
|
-
sMsg = '* errSynax:' + traceback.format_exc()
|
|
360
|
-
if errExit:
|
|
361
|
-
self.logger.error(sMsg)
|
|
362
|
-
sys.exit(-1)
|
|
363
|
-
finally:
|
|
364
|
-
self.mysql.commit()
|
|
365
|
-
cur.close()
|
|
366
|
-
if sMsg:
|
|
367
|
-
self.logger.error(sMsg)
|
|
368
|
-
return False, sMsg
|
|
369
|
-
|
|
370
|
-
def SelectFromDBFetchOne(self, sSql, errExit=True, args=None):
|
|
371
|
-
"""
|
|
372
|
-
使用sql语句查询并返回结果列表
|
|
373
|
-
:param sql:
|
|
374
|
-
:return:
|
|
375
|
-
"""
|
|
376
|
-
if not self.mysql:
|
|
377
|
-
raise ValueError("database conn or database config must have to have one")
|
|
378
|
-
if self.mysql.is_ping():
|
|
379
|
-
self.mysql.reConnect()
|
|
380
|
-
cur = self.mysql.get_new_cursor()
|
|
381
|
-
try:
|
|
382
|
-
self.logger.info(sSql + ";" + str(args))
|
|
383
|
-
result = cur.execute(sSql, args=args)
|
|
384
|
-
while True:
|
|
385
|
-
row = cur.fetchone()
|
|
386
|
-
if row is None:
|
|
387
|
-
return None
|
|
388
|
-
else:
|
|
389
|
-
yield row
|
|
390
|
-
except:
|
|
391
|
-
self.logger.error('* errSql:' + sSql)
|
|
392
|
-
sMsg = '* errSynax:' + traceback.format_exc()
|
|
393
|
-
if errExit:
|
|
394
|
-
self.logger.error(sMsg)
|
|
395
|
-
sys.exit(-1)
|
|
396
|
-
finally:
|
|
397
|
-
self.mysql.commit()
|
|
398
|
-
cur.close()
|
|
399
|
-
if sMsg:
|
|
400
|
-
self.logger.error(sMsg)
|
|
401
|
-
return None
|
|
402
|
-
|
|
403
|
-
def ExeSqlToDB(self, sSql, errExit=True, args=None):
|
|
404
|
-
if not self.mysql:
|
|
405
|
-
raise ValueError("database conn or database config must have to have one")
|
|
406
|
-
if self.mysql.is_ping():
|
|
407
|
-
self.mysql.reConnect()
|
|
408
|
-
cur = self.mysql.get_new_cursor()
|
|
409
|
-
try:
|
|
410
|
-
self.logger.info(sSql + ";" + str(args))
|
|
411
|
-
rows = cur.execute(sSql, args=args)
|
|
412
|
-
self.mysql.commit()
|
|
413
|
-
return True, rows
|
|
414
|
-
except:
|
|
415
|
-
self.mysql.rollback()
|
|
416
|
-
sMsg = '* errSynax:' + traceback.format_exc()
|
|
417
|
-
if errExit:
|
|
418
|
-
self.logger.error(sMsg)
|
|
419
|
-
sys.exit(-1)
|
|
420
|
-
finally:
|
|
421
|
-
self.mysql.commit()
|
|
422
|
-
cur.close()
|
|
423
|
-
if sMsg:
|
|
424
|
-
self.logger.error(sMsg)
|
|
425
|
-
return False, sMsg
|
|
426
|
-
|
|
427
|
-
# 更新数据库状态
|
|
428
|
-
def ExeSqlMany(self, sSql, args, errExit=True):
|
|
429
|
-
"""
|
|
430
|
-
该函数处理一个sql列表 没有返回并将列表置空
|
|
431
|
-
:param conn:
|
|
432
|
-
:param sSqlList:
|
|
433
|
-
:return:
|
|
434
|
-
"""
|
|
435
|
-
|
|
436
|
-
if not self.mysql:
|
|
437
|
-
raise ValueError("database conn or database config must have to have one")
|
|
438
|
-
if self.mysql.is_ping():
|
|
439
|
-
self.mysql.reConnect()
|
|
440
|
-
cur = self.mysql.get_new_cursor()
|
|
441
|
-
try:
|
|
442
|
-
self.logger.info(sSql + ";" + str(args))
|
|
443
|
-
rows = cur.executemany(sSql, args=args)
|
|
444
|
-
self.mysql.commit()
|
|
445
|
-
return True, rows
|
|
446
|
-
except:
|
|
447
|
-
self.mysql.rollback()
|
|
448
|
-
self.logger.error('*errSql:' + sSql)
|
|
449
|
-
dbMsg = '*updateError:' + traceback.format_exc()
|
|
450
|
-
if errExit:
|
|
451
|
-
self.logger.error(dbMsg)
|
|
452
|
-
sys.exit(-1)
|
|
453
|
-
finally:
|
|
454
|
-
self.mysql.commit()
|
|
455
|
-
cur.close()
|
|
456
|
-
if dbMsg:
|
|
457
|
-
self.logger.error(dbMsg)
|
|
458
|
-
return False, dbMsg
|
|
459
|
-
|
|
460
|
-
def escape_string(self, string):
|
|
461
|
-
return self.mysql.escape(string)
|
|
462
|
-
|
|
463
|
-
def pymysql_escape_string(self, strings):
|
|
464
|
-
return self.mysql.escape(strings)
|
|
465
|
-
|
|
466
|
-
def close(self):
|
|
467
|
-
self.mysql.db.close()
|
|
1
|
+
import sys
|
|
2
|
+
import traceback
|
|
3
|
+
|
|
4
|
+
import pymysql
|
|
5
|
+
|
|
6
|
+
from re_common.baselibrary import MLogger
|
|
7
|
+
from re_common.baselibrary.baseabs import BaseAbs
|
|
8
|
+
from re_common.baselibrary.database.mbuilder import MysqlBuilderAbstract
|
|
9
|
+
from re_common.baselibrary.database.moudle import SqlMoudle
|
|
10
|
+
from re_common.baselibrary.readconfig.ini_config import IniConfig
|
|
11
|
+
from re_common.baselibrary.readconfig.toml_config import TomlConfig
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class MysqlBuilder(MysqlBuilderAbstract):
|
|
15
|
+
def __init__(self, configfile, configname, keytransformdicts=None):
|
|
16
|
+
# sql的moudle对象 mysql通过该对象对接参数
|
|
17
|
+
self.sqlmoudle = SqlMoudle()
|
|
18
|
+
# 获取配置文件对象
|
|
19
|
+
self.ic = IniConfig(configfile).builder()
|
|
20
|
+
# 配置文件位置
|
|
21
|
+
self.configfile = configfile
|
|
22
|
+
# 配置文件的sections
|
|
23
|
+
self.configname = configname
|
|
24
|
+
# 使用key转换器转换key(主要用于配置文件的key与我们默认读取时的key不一致)
|
|
25
|
+
self.keytransformdicts = keytransformdicts
|
|
26
|
+
"""
|
|
27
|
+
python2
|
|
28
|
+
self.config.readfp(open(configfile, 'rb'))
|
|
29
|
+
python3
|
|
30
|
+
self.config.read_file(open(configfile, 'r'))
|
|
31
|
+
"""
|
|
32
|
+
|
|
33
|
+
def build_port(self, port):
|
|
34
|
+
self.sqlmoudle.port = int(self.ic.get_value(self.configname, port))
|
|
35
|
+
return self
|
|
36
|
+
|
|
37
|
+
def build_server_address(self, host):
|
|
38
|
+
self.sqlmoudle.host = self.ic.get_value(self.configname, host)
|
|
39
|
+
return self
|
|
40
|
+
|
|
41
|
+
def build_password(self, passwd):
|
|
42
|
+
self.sqlmoudle.passwd = self.ic.get_value(self.configname, passwd)
|
|
43
|
+
return self
|
|
44
|
+
|
|
45
|
+
def use_db(self, db):
|
|
46
|
+
self.sqlmoudle.db = self.ic.get_value(self.configname, db)
|
|
47
|
+
return self
|
|
48
|
+
|
|
49
|
+
def build_username(self, user):
|
|
50
|
+
self.sqlmoudle.user = self.ic.get_value(self.configname, user)
|
|
51
|
+
return self
|
|
52
|
+
|
|
53
|
+
def build_chart(self, chartset):
|
|
54
|
+
self.sqlmoudle.charset = self.ic.get_value(self.configname, chartset)
|
|
55
|
+
return self
|
|
56
|
+
|
|
57
|
+
def build_cursorclass(self, cursornum):
|
|
58
|
+
if cursornum == 1:
|
|
59
|
+
self.sqlmoudle.cursorclass = pymysql.cursors.DictCursor
|
|
60
|
+
else:
|
|
61
|
+
# 默认保持不变
|
|
62
|
+
pass
|
|
63
|
+
|
|
64
|
+
return self
|
|
65
|
+
|
|
66
|
+
# def build_cursorclass(self,cursorclass):
|
|
67
|
+
# self.sqlmoudle.cursorclass = self.ic.get_value(self.configname, cursorclass)
|
|
68
|
+
|
|
69
|
+
def get_moudle(self):
|
|
70
|
+
"""
|
|
71
|
+
返回数据库连接需要的对象
|
|
72
|
+
:return:
|
|
73
|
+
"""
|
|
74
|
+
return self.sqlmoudle
|
|
75
|
+
|
|
76
|
+
def build_all(self):
|
|
77
|
+
if not self.keytransformdicts:
|
|
78
|
+
# 不传入时不转换
|
|
79
|
+
self.keytransformdicts = {"port": "port", "host": "host", "passwd": "passwd", "user": "user", "db": "db",
|
|
80
|
+
"chartset": "chartset"}
|
|
81
|
+
self.build_port(self.keytransformdicts["port"])
|
|
82
|
+
self.build_server_address(self.keytransformdicts["host"])
|
|
83
|
+
self.build_password(self.keytransformdicts["passwd"])
|
|
84
|
+
self.build_username(self.keytransformdicts["user"])
|
|
85
|
+
self.use_db(self.keytransformdicts["db"])
|
|
86
|
+
self.build_chart(self.keytransformdicts["chartset"])
|
|
87
|
+
return self
|
|
88
|
+
|
|
89
|
+
def get_tuples(self):
|
|
90
|
+
return self.sqlmoudle.host, self.sqlmoudle.user, self.sqlmoudle.passwd, self.sqlmoudle.port
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
class MysqlBuilderForToml(MysqlBuilderAbstract):
|
|
94
|
+
def __init__(self, configfile, sesc, keytransformdicts=None):
|
|
95
|
+
# sql的moudle对象 mysql通过该对象对接参数
|
|
96
|
+
self.sqlmoudle = SqlMoudle()
|
|
97
|
+
# 获取配置文件对象
|
|
98
|
+
self.dic = TomlConfig(configfile).read_file_remove_bom().get_dicts()
|
|
99
|
+
# 配置文件位置
|
|
100
|
+
self.configfile = configfile
|
|
101
|
+
# 配置文件的sections
|
|
102
|
+
self.sesc = sesc
|
|
103
|
+
# 使用key转换器转换key(主要用于配置文件的key与我们默认读取时的key不一致)
|
|
104
|
+
self.keytransformdicts = keytransformdicts
|
|
105
|
+
"""
|
|
106
|
+
python2
|
|
107
|
+
self.config.readfp(open(configfile, 'rb'))
|
|
108
|
+
python3
|
|
109
|
+
self.config.read_file(open(configfile, 'r'))
|
|
110
|
+
"""
|
|
111
|
+
|
|
112
|
+
def build_port(self, port):
|
|
113
|
+
self.sqlmoudle.port = int(self.dic[self.sesc][port])
|
|
114
|
+
return self
|
|
115
|
+
|
|
116
|
+
def build_server_address(self, host):
|
|
117
|
+
self.sqlmoudle.host = self.dic[self.sesc][host]
|
|
118
|
+
return self
|
|
119
|
+
|
|
120
|
+
def build_password(self, passwd):
|
|
121
|
+
self.sqlmoudle.passwd = self.dic[self.sesc][passwd]
|
|
122
|
+
return self
|
|
123
|
+
|
|
124
|
+
def use_db(self, db):
|
|
125
|
+
self.sqlmoudle.db = self.dic[self.sesc][db]
|
|
126
|
+
return self
|
|
127
|
+
|
|
128
|
+
def build_username(self, user):
|
|
129
|
+
self.sqlmoudle.user = self.dic[self.sesc][user]
|
|
130
|
+
return self
|
|
131
|
+
|
|
132
|
+
def build_chart(self, chartset):
|
|
133
|
+
self.sqlmoudle.charset = self.dic[self.sesc][chartset]
|
|
134
|
+
return self
|
|
135
|
+
|
|
136
|
+
def build_cursorclass(self, cursornum):
|
|
137
|
+
if cursornum == 1:
|
|
138
|
+
self.sqlmoudle.cursorclass = pymysql.cursors.DictCursor
|
|
139
|
+
else:
|
|
140
|
+
# 默认保持不变
|
|
141
|
+
pass
|
|
142
|
+
|
|
143
|
+
return self
|
|
144
|
+
|
|
145
|
+
def get_moudle(self):
|
|
146
|
+
"""
|
|
147
|
+
返回数据库连接需要的对象
|
|
148
|
+
:return:
|
|
149
|
+
"""
|
|
150
|
+
return self.sqlmoudle
|
|
151
|
+
|
|
152
|
+
def build_all(self):
|
|
153
|
+
if not self.keytransformdicts:
|
|
154
|
+
# 不传入时不转换
|
|
155
|
+
self.keytransformdicts = {"port": "port", "host": "host", "passwd": "passwd", "user": "user", "db": "db",
|
|
156
|
+
"chartset": "chartset"}
|
|
157
|
+
self.build_port(self.keytransformdicts["port"])
|
|
158
|
+
self.build_server_address(self.keytransformdicts["host"])
|
|
159
|
+
self.build_password(self.keytransformdicts["passwd"])
|
|
160
|
+
self.build_username(self.keytransformdicts["user"])
|
|
161
|
+
self.use_db(self.keytransformdicts["db"])
|
|
162
|
+
self.build_chart(self.keytransformdicts["chartset"])
|
|
163
|
+
return self
|
|
164
|
+
|
|
165
|
+
def get_tuples(self):
|
|
166
|
+
return self.sqlmoudle.host, self.sqlmoudle.user, self.sqlmoudle.passwd, self.sqlmoudle.port
|
|
167
|
+
|
|
168
|
+
|
|
169
|
+
class MysqlBuilderForDicts(MysqlBuilderAbstract):
|
|
170
|
+
def __init__(self, dicts, keytransformdicts=None):
|
|
171
|
+
# sql的moudle对象 mysql通过该对象对接参数
|
|
172
|
+
self.sqlmoudle = SqlMoudle()
|
|
173
|
+
self.dicts = dicts
|
|
174
|
+
# 使用key转换器转换key(主要用于配置文件的key与我们默认读取时的key不一致)
|
|
175
|
+
self.keytransformdicts = keytransformdicts
|
|
176
|
+
|
|
177
|
+
def build_port(self, port):
|
|
178
|
+
self.sqlmoudle.port = int(self.dicts[port])
|
|
179
|
+
return self
|
|
180
|
+
|
|
181
|
+
def build_server_address(self, host):
|
|
182
|
+
self.sqlmoudle.host = self.dicts[host]
|
|
183
|
+
return self
|
|
184
|
+
|
|
185
|
+
def build_password(self, passwd):
|
|
186
|
+
self.sqlmoudle.passwd = self.dicts[passwd]
|
|
187
|
+
return self
|
|
188
|
+
|
|
189
|
+
def use_db(self, db):
|
|
190
|
+
self.sqlmoudle.db = self.dicts[db]
|
|
191
|
+
return self
|
|
192
|
+
|
|
193
|
+
def build_username(self, user):
|
|
194
|
+
self.sqlmoudle.user = self.dicts[user]
|
|
195
|
+
return self
|
|
196
|
+
|
|
197
|
+
def build_chart(self, chartset):
|
|
198
|
+
self.sqlmoudle.charset = self.dicts[chartset]
|
|
199
|
+
return self
|
|
200
|
+
|
|
201
|
+
def build_cursorclass(self, cursornum):
|
|
202
|
+
if cursornum == 1:
|
|
203
|
+
self.sqlmoudle.cursorclass = pymysql.cursors.DictCursor
|
|
204
|
+
else:
|
|
205
|
+
# 默认保持不变
|
|
206
|
+
pass
|
|
207
|
+
|
|
208
|
+
return self
|
|
209
|
+
|
|
210
|
+
def get_moudle(self):
|
|
211
|
+
"""
|
|
212
|
+
返回数据库连接需要的对象
|
|
213
|
+
:return:
|
|
214
|
+
"""
|
|
215
|
+
return self.sqlmoudle
|
|
216
|
+
|
|
217
|
+
def build_all(self):
|
|
218
|
+
if not self.keytransformdicts:
|
|
219
|
+
# 不传入时不转换
|
|
220
|
+
self.keytransformdicts = {"port": "port", "host": "host", "passwd": "passwd", "user": "user", "db": "db",
|
|
221
|
+
"chartset": "chartset"}
|
|
222
|
+
self.build_port(self.keytransformdicts["port"])
|
|
223
|
+
self.build_server_address(self.keytransformdicts["host"])
|
|
224
|
+
self.build_password(self.keytransformdicts["passwd"])
|
|
225
|
+
self.build_username(self.keytransformdicts["user"])
|
|
226
|
+
self.use_db(self.keytransformdicts["db"])
|
|
227
|
+
self.build_chart(self.keytransformdicts["chartset"])
|
|
228
|
+
return self
|
|
229
|
+
|
|
230
|
+
def get_tuples(self):
|
|
231
|
+
return self.sqlmoudle.host, self.sqlmoudle.user, self.sqlmoudle.passwd, self.sqlmoudle.port
|
|
232
|
+
|
|
233
|
+
|
|
234
|
+
class MysqlUtiles(object):
|
|
235
|
+
def __init__(self, cfgfilepath, sesc, logger=None, keytransformdicts=None, builder="MysqlBuilder", cursorsnum=0,
|
|
236
|
+
dicts=None):
|
|
237
|
+
"""
|
|
238
|
+
|
|
239
|
+
:param cfgfilepath:
|
|
240
|
+
:param sesc:
|
|
241
|
+
:param logger:
|
|
242
|
+
:param keytransformdicts:
|
|
243
|
+
:param builder:
|
|
244
|
+
:param cursors: 0表示默认,1 表示dicts 其他情况后面再添加
|
|
245
|
+
"""
|
|
246
|
+
self._logger = logger
|
|
247
|
+
# 通过工厂方法获取mysql对象
|
|
248
|
+
self.mysql = BaseAbs.get_sql_factory().mysql_factory("mysql")
|
|
249
|
+
# mysql 连接通过builder进行适配 这里的builder通过配置文件获取相关连接信息
|
|
250
|
+
# 也可以通过继承 MysqlBuilderAbstract 后自己手动设置builer
|
|
251
|
+
if builder == "MysqlBuilder":
|
|
252
|
+
self.builder = MysqlBuilder(cfgfilepath, sesc, keytransformdicts)
|
|
253
|
+
elif builder == "MysqlBuilderForToml":
|
|
254
|
+
self.builder = MysqlBuilderForToml(cfgfilepath, sesc, keytransformdicts)
|
|
255
|
+
elif builder == "MysqlBuilderForDicts":
|
|
256
|
+
self.builder = MysqlBuilderForDicts(dicts, keytransformdicts)
|
|
257
|
+
else:
|
|
258
|
+
raise Exception("传入builder 参数有误")
|
|
259
|
+
self.builder = self.builder.build_all().build_cursorclass(cursorsnum)
|
|
260
|
+
self.moudle = self.builder.get_moudle()
|
|
261
|
+
# 连接mysql通过唯一适配moudle
|
|
262
|
+
# print(self.moudle.to_dict())
|
|
263
|
+
self.mysql.link(self.moudle)
|
|
264
|
+
|
|
265
|
+
@property
|
|
266
|
+
def logger(self):
|
|
267
|
+
if self._logger is None:
|
|
268
|
+
self._logger = MLogger().streamlogger
|
|
269
|
+
return self._logger
|
|
270
|
+
|
|
271
|
+
@logger.setter
|
|
272
|
+
def logger(self, value):
|
|
273
|
+
assert isinstance(value, MLogger)
|
|
274
|
+
self._logger = value
|
|
275
|
+
|
|
276
|
+
# 更新数据库状态
|
|
277
|
+
def ExeSqlListToDB(self, sSqlList, errExit=True, args=None):
|
|
278
|
+
"""
|
|
279
|
+
该函数处理一个sql列表 没有返回并将列表置空
|
|
280
|
+
:param sSqlList:
|
|
281
|
+
:return:
|
|
282
|
+
"""
|
|
283
|
+
dbMsg = None
|
|
284
|
+
if not self.mysql:
|
|
285
|
+
raise ValueError("database conn or database config must have to have one")
|
|
286
|
+
if not self.mysql.is_ping():
|
|
287
|
+
self.mysql.reConnect()
|
|
288
|
+
cursor = self.mysql.get_new_cursor()
|
|
289
|
+
errcount = 0
|
|
290
|
+
successcount = 0
|
|
291
|
+
for sql in sSqlList:
|
|
292
|
+
try:
|
|
293
|
+
self.logger.info(sql + ";" + str(args))
|
|
294
|
+
cursor.execute(sql, args=args)
|
|
295
|
+
successcount += 1
|
|
296
|
+
except:
|
|
297
|
+
errcount += 1
|
|
298
|
+
self.mysql.commit()
|
|
299
|
+
self.logger.error('*errSql:' + sql)
|
|
300
|
+
dbMsg = '*updateError:' + traceback.format_exc()
|
|
301
|
+
if errExit:
|
|
302
|
+
self.logger.error(dbMsg)
|
|
303
|
+
sys.exit(-1)
|
|
304
|
+
if dbMsg:
|
|
305
|
+
self.logger.error(dbMsg)
|
|
306
|
+
self.mysql.commit()
|
|
307
|
+
cursor.close()
|
|
308
|
+
if errcount:
|
|
309
|
+
return False, successcount, errcount
|
|
310
|
+
else:
|
|
311
|
+
return True, successcount, errcount
|
|
312
|
+
|
|
313
|
+
def SelectFromDB(self, sSql, errExit=True, args=None):
|
|
314
|
+
"""
|
|
315
|
+
使用sql语句查询并返回结果列表
|
|
316
|
+
:param sql:
|
|
317
|
+
:return:
|
|
318
|
+
"""
|
|
319
|
+
if not self.mysql:
|
|
320
|
+
raise ValueError("database conn or database config must have to have one")
|
|
321
|
+
if self.mysql.is_ping():
|
|
322
|
+
self.mysql.reConnect()
|
|
323
|
+
cursor = self.mysql.get_new_cursor()
|
|
324
|
+
try:
|
|
325
|
+
self.logger.info(sSql + ";" + str(args))
|
|
326
|
+
result = cursor.execute(sSql, args=args)
|
|
327
|
+
rows = cursor.fetchall()
|
|
328
|
+
return True, rows
|
|
329
|
+
except:
|
|
330
|
+
self.logger.error('* errSql:' + sSql)
|
|
331
|
+
sMsg = '* errSynax:' + traceback.format_exc()
|
|
332
|
+
if errExit:
|
|
333
|
+
self.logger.error(sMsg)
|
|
334
|
+
sys.exit(-1)
|
|
335
|
+
finally:
|
|
336
|
+
self.mysql.commit()
|
|
337
|
+
cursor.close()
|
|
338
|
+
if sMsg:
|
|
339
|
+
self.logger.error(sMsg)
|
|
340
|
+
return False, sMsg
|
|
341
|
+
|
|
342
|
+
def SelectFromDBFetchOne_noyield(self, sSql, errExit=True, args=None):
|
|
343
|
+
"""
|
|
344
|
+
使用sql语句查询并返回结果列表
|
|
345
|
+
:param sql:
|
|
346
|
+
:return:
|
|
347
|
+
"""
|
|
348
|
+
if not self.mysql:
|
|
349
|
+
raise ValueError("database conn or database config must have to have one")
|
|
350
|
+
if self.mysql.is_ping():
|
|
351
|
+
self.mysql.reConnect()
|
|
352
|
+
cur = self.mysql.get_new_cursor()
|
|
353
|
+
try:
|
|
354
|
+
self.logger.info(sSql + ";" + str(args))
|
|
355
|
+
result = cur.execute(sSql, args=args)
|
|
356
|
+
return True, cur.fetchone()
|
|
357
|
+
except:
|
|
358
|
+
self.logger.error('* errSql:' + sSql)
|
|
359
|
+
sMsg = '* errSynax:' + traceback.format_exc()
|
|
360
|
+
if errExit:
|
|
361
|
+
self.logger.error(sMsg)
|
|
362
|
+
sys.exit(-1)
|
|
363
|
+
finally:
|
|
364
|
+
self.mysql.commit()
|
|
365
|
+
cur.close()
|
|
366
|
+
if sMsg:
|
|
367
|
+
self.logger.error(sMsg)
|
|
368
|
+
return False, sMsg
|
|
369
|
+
|
|
370
|
+
def SelectFromDBFetchOne(self, sSql, errExit=True, args=None):
|
|
371
|
+
"""
|
|
372
|
+
使用sql语句查询并返回结果列表
|
|
373
|
+
:param sql:
|
|
374
|
+
:return:
|
|
375
|
+
"""
|
|
376
|
+
if not self.mysql:
|
|
377
|
+
raise ValueError("database conn or database config must have to have one")
|
|
378
|
+
if self.mysql.is_ping():
|
|
379
|
+
self.mysql.reConnect()
|
|
380
|
+
cur = self.mysql.get_new_cursor()
|
|
381
|
+
try:
|
|
382
|
+
self.logger.info(sSql + ";" + str(args))
|
|
383
|
+
result = cur.execute(sSql, args=args)
|
|
384
|
+
while True:
|
|
385
|
+
row = cur.fetchone()
|
|
386
|
+
if row is None:
|
|
387
|
+
return None
|
|
388
|
+
else:
|
|
389
|
+
yield row
|
|
390
|
+
except:
|
|
391
|
+
self.logger.error('* errSql:' + sSql)
|
|
392
|
+
sMsg = '* errSynax:' + traceback.format_exc()
|
|
393
|
+
if errExit:
|
|
394
|
+
self.logger.error(sMsg)
|
|
395
|
+
sys.exit(-1)
|
|
396
|
+
finally:
|
|
397
|
+
self.mysql.commit()
|
|
398
|
+
cur.close()
|
|
399
|
+
if sMsg:
|
|
400
|
+
self.logger.error(sMsg)
|
|
401
|
+
return None
|
|
402
|
+
|
|
403
|
+
def ExeSqlToDB(self, sSql, errExit=True, args=None):
|
|
404
|
+
if not self.mysql:
|
|
405
|
+
raise ValueError("database conn or database config must have to have one")
|
|
406
|
+
if self.mysql.is_ping():
|
|
407
|
+
self.mysql.reConnect()
|
|
408
|
+
cur = self.mysql.get_new_cursor()
|
|
409
|
+
try:
|
|
410
|
+
self.logger.info(sSql + ";" + str(args))
|
|
411
|
+
rows = cur.execute(sSql, args=args)
|
|
412
|
+
self.mysql.commit()
|
|
413
|
+
return True, rows
|
|
414
|
+
except:
|
|
415
|
+
self.mysql.rollback()
|
|
416
|
+
sMsg = '* errSynax:' + traceback.format_exc()
|
|
417
|
+
if errExit:
|
|
418
|
+
self.logger.error(sMsg)
|
|
419
|
+
sys.exit(-1)
|
|
420
|
+
finally:
|
|
421
|
+
self.mysql.commit()
|
|
422
|
+
cur.close()
|
|
423
|
+
if sMsg:
|
|
424
|
+
self.logger.error(sMsg)
|
|
425
|
+
return False, sMsg
|
|
426
|
+
|
|
427
|
+
# 更新数据库状态
|
|
428
|
+
def ExeSqlMany(self, sSql, args, errExit=True):
|
|
429
|
+
"""
|
|
430
|
+
该函数处理一个sql列表 没有返回并将列表置空
|
|
431
|
+
:param conn:
|
|
432
|
+
:param sSqlList:
|
|
433
|
+
:return:
|
|
434
|
+
"""
|
|
435
|
+
|
|
436
|
+
if not self.mysql:
|
|
437
|
+
raise ValueError("database conn or database config must have to have one")
|
|
438
|
+
if self.mysql.is_ping():
|
|
439
|
+
self.mysql.reConnect()
|
|
440
|
+
cur = self.mysql.get_new_cursor()
|
|
441
|
+
try:
|
|
442
|
+
self.logger.info(sSql + ";" + str(args))
|
|
443
|
+
rows = cur.executemany(sSql, args=args)
|
|
444
|
+
self.mysql.commit()
|
|
445
|
+
return True, rows
|
|
446
|
+
except:
|
|
447
|
+
self.mysql.rollback()
|
|
448
|
+
self.logger.error('*errSql:' + sSql)
|
|
449
|
+
dbMsg = '*updateError:' + traceback.format_exc()
|
|
450
|
+
if errExit:
|
|
451
|
+
self.logger.error(dbMsg)
|
|
452
|
+
sys.exit(-1)
|
|
453
|
+
finally:
|
|
454
|
+
self.mysql.commit()
|
|
455
|
+
cur.close()
|
|
456
|
+
if dbMsg:
|
|
457
|
+
self.logger.error(dbMsg)
|
|
458
|
+
return False, dbMsg
|
|
459
|
+
|
|
460
|
+
def escape_string(self, string):
|
|
461
|
+
return self.mysql.escape(string)
|
|
462
|
+
|
|
463
|
+
def pymysql_escape_string(self, strings):
|
|
464
|
+
return self.mysql.escape(strings)
|
|
465
|
+
|
|
466
|
+
def close(self):
|
|
467
|
+
self.mysql.db.close()
|