mdbq 0.2.6__py3-none-any.whl → 0.2.7__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.
mdbq/mysql/data_types.py CHANGED
@@ -252,4 +252,10 @@ def main():
252
252
 
253
253
  if __name__ == '__main__':
254
254
  # main()
255
- mysql_all_dtypes()
255
+ # mysql_all_dtypes()
256
+
257
+ path = '/Users/xigua/数据中心/自动0备份/py/数据更新/support'
258
+ d = DataTypes()
259
+ # 从本地文件中读取 dtype 信息
260
+ dtypes = d.load_dtypes(cl='mysql', db_name='生意经2', collection_name='店铺指标', path=path)
261
+ print(dtypes)
mdbq/mysql/mysql.py CHANGED
@@ -13,6 +13,7 @@ import os
13
13
  import calendar
14
14
  from mdbq.config import get_myconf
15
15
  from mdbq.dataframe import converter
16
+ from mdbq.mysql import data_types
16
17
 
17
18
  warnings.filterwarnings('ignore')
18
19
 
@@ -107,12 +108,15 @@ class MysqlUpload:
107
108
  cursor.execute(sql)
108
109
  print(f'创建 mysql 表: {tabel_name}')
109
110
 
110
- cols = df.columns.tolist()
111
- dtypes = df.dtypes.apply(str).to_dict() # 将 dataframe 数据类型转为字典形式
112
- # 转换为 mysql 的数据类型
113
- dtypes.update({col: self.convert_dtype_to_sql(df=df, col=col, dtype=dtypes[col]) for col in cols})
111
+ # # 2. 列数据类型转换
112
+ # cols = df.columns.tolist()
113
+ # dtypes = df.dtypes.apply(str).to_dict() # 将 dataframe 数据类型转为字典形式
114
+ # # 转换为 mysql 的数据类型
115
+ # dtypes.update({col: self.convert_dtype_to_sql(df=df, col=col, dtype=dtypes[col]) for col in cols})
116
+ dtypes = self.convert_dtypes(df=df, db_name=db_name, tabel_name=tabel_name)
114
117
 
115
- # 2. 检查列, 不存在则添加新列
118
+ # 3. 检查列, 不存在则添加新列
119
+ cols = df.columns.tolist()
116
120
  for col in cols:
117
121
  sql = ('SELECT 1 FROM information_schema.columns WHERE table_schema = %s AND table_name = %s AND '
118
122
  'column_name = %s')
@@ -134,7 +138,7 @@ class MysqlUpload:
134
138
  cursor.execute(f"CREATE INDEX index_name ON {tabel_name}({col})")
135
139
  connection.commit() # 提交事务
136
140
 
137
- # # 3. 移除指定日期范围内的数据, 避免重复插入
141
+ # # 4. 移除指定日期范围内的数据, 避免重复插入
138
142
  # dates = df['日期'].values.tolist()
139
143
  # start_date = pd.to_datetime(min(dates)).strftime('%Y-%m-%d')
140
144
  # end_date = (pd.to_datetime(max(dates)) + datetime.timedelta(days=1)).strftime('%Y-%m-%d')
@@ -142,7 +146,7 @@ class MysqlUpload:
142
146
  # cursor.execute(sql)
143
147
  # connection.commit()
144
148
 
145
- # 4. 更新插入数据
149
+ # 5. 更新插入数据
146
150
  now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S ")
147
151
  print(f'{now}正在更新 mysql ({self.host}:{self.port}) {db_name}/{tabel_name}')
148
152
  if str(self.host) == '192.168.1.100': # 群晖服务器
@@ -176,8 +180,40 @@ class MysqlUpload:
176
180
  finally:
177
181
  connection.close()
178
182
 
183
+ def convert_dtypes(self, df, db_name, tabel_name):
184
+ """
185
+ 根据本地已经存在的记录着 mysql dtypes 的 json 文件转换 df 的类型为 mysql 专有的数据类型
186
+ 允许通过 json 文件指定列的数据类型
187
+ 以下两种情况已经兼容:
188
+ 1. 可能不存在本地 json 文件 (利用 convert_dtype_to_sql 函数按指定规则转换全部列)
189
+ 2. json 文件中没有或者缺失部分列信息(利用 convert_dtype_to_sql 函数按指定规则转换缺失列)
190
+ """
191
+ cols = df.columns.tolist()
192
+ path = '/Users/xigua/数据中心/自动0备份/py/数据更新/support'
193
+ # json_file = os.path.join(path, 'df_dtypes.json')
194
+ # if os.path.isfile(json_file):
195
+ d = data_types.DataTypes()
196
+ # 从本地文件中读取 dtype 信息
197
+ dtypes = d.load_dtypes(cl='mysql', db_name=db_name, collection_name=tabel_name, path=path)
198
+ # 可能会因为没有 json 文件, 返回 None
199
+ if dtypes:
200
+ # 按照文件记录更新 dtypes
201
+ dtypes.update({col: dtypes[col] for col in cols if col in dtypes.keys()})
202
+ # 可能存在部分列不在文件记录中
203
+ col_not_exist = [col for col in cols if col not in dtypes.keys()]
204
+ # 这些列不存在于 df 中, 必须移除
205
+ [dtypes.pop(col) for col in list(dtypes.keys()) if col not in cols]
206
+ else:
207
+ dtypes = df.dtypes.apply(str).to_dict() # 将 dataframe 数据类型转为字典形式
208
+ col_not_exist = cols
209
+ # 对文件不存在的列信息进行数据类型转换(按指定规则)
210
+ dtypes.update({col: self.convert_dtype_to_sql(df=df, col=col, dtype=df[col].dtype) for col in col_not_exist})
211
+ # 至此 df 中全部列类型已经转换完成
212
+ # 返回结果, 示例: {'上市年份': 'mediumtext', '商品id': 'mediumtext', '平台': 'mediumtext'}
213
+ return dtypes
214
+
179
215
  def convert_dtype_to_sql(self, df, col, dtype):
180
- """ 转换DataFrame列的数据类型为SQL数据类型 """
216
+ """ 按照以下规则转换DataFrame列的数据类型为 MYSQL 专有的数据类型 """
181
217
  # 最优先处理 ID 类型, 在 mysql 里面, 有些列数字过长不能存储为 int 类型
182
218
  if 'id' in col or 'ID' in col or 'Id' in col or '摘要' in col or '商家编码' in col or '单号' in col or '款号' in col:
183
219
  return 'mediumtext'
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: mdbq
3
- Version: 0.2.6
3
+ Version: 0.2.7
4
4
  Home-page: https://pypi.org/project/mdbsql
5
5
  Author: xigua,
6
6
  Author-email: 2587125111@qq.com
@@ -20,8 +20,8 @@ mdbq/log/mylogger.py,sha256=oaT7Bp-Hb9jZt52seP3ISUuxVcI19s4UiqTeouScBO0,3258
20
20
  mdbq/mongo/__init__.py,sha256=SILt7xMtQIQl_m-ik9WLtJSXIVf424iYgCfE_tnQFbw,13
21
21
  mdbq/mongo/mongo.py,sha256=q0B4wXDSTtXg_vMN7MPh6zdxl6tT68tM74LmdVNQQek,31892
22
22
  mdbq/mysql/__init__.py,sha256=A_DPJyAoEvTSFojiI2e94zP0FKtCkkwKP1kYUCSyQzo,11
23
- mdbq/mysql/data_types.py,sha256=OERyHwG61s-agBM1aERESYY4GWwJwaZ7NtQfbe6GTgo,10732
24
- mdbq/mysql/mysql.py,sha256=nVrnkHWlcttr3Mx0Bdneb04oTlKtbDL9WrAUY4IEnow,31363
23
+ mdbq/mysql/data_types.py,sha256=-miEqNaXgDKUp3z6SkBD6D4kj6_dVeWM0rCeeK0jEi4,10998
24
+ mdbq/mysql/mysql.py,sha256=BNKICpMCFskg8Zk8iR1tmDmOTvtNbOf8_lORPgHBdWs,33570
25
25
  mdbq/mysql/s_query.py,sha256=6-8O9MHhi3-7n3isJ7t2kTCYL2mSBC_HrxSQmXM5UtI,7901
26
26
  mdbq/mysql/year_month_day.py,sha256=VgewoE2pJxK7ErjfviL_SMTN77ki8GVbTUcao3vFUCE,1523
27
27
  mdbq/other/__init__.py,sha256=jso1oHcy6cJEfa7udS_9uO5X6kZLoPBF8l3wCYmr5dM,18
@@ -32,7 +32,7 @@ mdbq/pbix/__init__.py,sha256=Trtfaynu9RjoTyLLYBN2xdRxTvm_zhCniUkVTAYwcjo,24
32
32
  mdbq/pbix/pbix_refresh.py,sha256=JUjKW3bNEyoMVfVfo77UhguvS5AWkixvVhDbw4_MHco,2396
33
33
  mdbq/pbix/refresh_all.py,sha256=wulHs4rivf4Mi0Pii2QR5Nk9-TBcvSwnCB_WH9QULKE,5939
34
34
  mdbq/spider/__init__.py,sha256=RBMFXGy_jd1HXZhngB2T2XTvJqki8P_Fr-pBcwijnew,18
35
- mdbq-0.2.6.dist-info/METADATA,sha256=8LcMCf68lhTCbfYzyPiNS1aDNHCYcoyACREnmrtWZsc,245
36
- mdbq-0.2.6.dist-info/WHEEL,sha256=eOLhNAGa2EW3wWl_TU484h7q1UNgy0JXjjoqKoxAAQc,92
37
- mdbq-0.2.6.dist-info/top_level.txt,sha256=2FQ-uLnCSB-OwFiWntzmwosW3X2Xqsg0ewh1axsaylA,5
38
- mdbq-0.2.6.dist-info/RECORD,,
35
+ mdbq-0.2.7.dist-info/METADATA,sha256=CC4QeA4zCHTt9DFEDHBv55Ki22hsywd4BMndbzWLyYY,245
36
+ mdbq-0.2.7.dist-info/WHEEL,sha256=cpQTJ5IWu9CdaPViMhC9YzF8gZuS5-vlfoFihTBC86A,91
37
+ mdbq-0.2.7.dist-info/top_level.txt,sha256=2FQ-uLnCSB-OwFiWntzmwosW3X2Xqsg0ewh1axsaylA,5
38
+ mdbq-0.2.7.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: bdist_wheel (0.44.0)
2
+ Generator: setuptools (70.1.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5