cppackage 0.2.1__py3-none-any.whl → 0.2.3__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.
- CPpackage/db/__init__.py +1 -1
- CPpackage/db/sql_model.py +44 -44
- {cppackage-0.2.1.dist-info → cppackage-0.2.3.dist-info}/METADATA +7 -4
- cppackage-0.2.3.dist-info/RECORD +12 -0
- cppackage-0.2.1.dist-info/RECORD +0 -12
- {cppackage-0.2.1.dist-info → cppackage-0.2.3.dist-info}/WHEEL +0 -0
- {cppackage-0.2.1.dist-info → cppackage-0.2.3.dist-info}/entry_points.txt +0 -0
- {cppackage-0.2.1.dist-info → cppackage-0.2.3.dist-info}/licenses/LICENSE +0 -0
- {cppackage-0.2.1.dist-info → cppackage-0.2.3.dist-info}/top_level.txt +0 -0
CPpackage/db/__init__.py
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
from .sql_model import sel_data,
|
|
1
|
+
from .sql_model import sel_data, update_datas, del_data
|
|
2
2
|
from .config import set_db_config, get_db_config
|
CPpackage/db/sql_model.py
CHANGED
|
@@ -32,7 +32,7 @@ def _get_connection(database=None, port=None):
|
|
|
32
32
|
)
|
|
33
33
|
|
|
34
34
|
|
|
35
|
-
# =====================
|
|
35
|
+
# ===================== 查询操作 =====================
|
|
36
36
|
|
|
37
37
|
def sel_data(sql, params=None, port=None, database=None):
|
|
38
38
|
|
|
@@ -45,9 +45,16 @@ def sel_data(sql, params=None, port=None, database=None):
|
|
|
45
45
|
except pymysql.MySQLError as e:
|
|
46
46
|
print("查询失败:", e)
|
|
47
47
|
return None
|
|
48
|
+
|
|
49
|
+
# ===================== 增量更新 =====================
|
|
50
|
+
def incremental_update(sql, values, port=None, database=None):
|
|
51
|
+
with _get_connection(database=database, port=port) as conn:
|
|
52
|
+
with conn.cursor() as cursor:
|
|
53
|
+
cursor.executemany(sql, values)
|
|
54
|
+
conn.commit()
|
|
48
55
|
|
|
49
56
|
|
|
50
|
-
|
|
57
|
+
# ===================== 删除操作 =====================
|
|
51
58
|
def del_data(sql, params=None, port=None, database=None):
|
|
52
59
|
|
|
53
60
|
try:
|
|
@@ -94,12 +101,10 @@ def add_columns(table_name, database, columns):
|
|
|
94
101
|
conn.commit()
|
|
95
102
|
|
|
96
103
|
# 表结构校验
|
|
97
|
-
def check_and_sync_columns(df,
|
|
104
|
+
def check_and_sync_columns(df ,table_name, database, max_new=5):
|
|
98
105
|
|
|
99
106
|
df_cols = set(df.columns)
|
|
100
|
-
|
|
101
|
-
db_cols = set(get_table_columns(table_name, database))
|
|
102
|
-
|
|
107
|
+
db_cols= get_table_columns(table_name, database)
|
|
103
108
|
new_cols = df_cols - db_cols
|
|
104
109
|
missing_cols = db_cols - df_cols
|
|
105
110
|
print("新增字段:", new_cols if new_cols else "无")
|
|
@@ -114,13 +119,6 @@ def check_and_sync_columns(df, table_name, database, max_new=5):
|
|
|
114
119
|
|
|
115
120
|
print("开始同步字段...")
|
|
116
121
|
add_columns(table_name, database, new_cols)
|
|
117
|
-
|
|
118
|
-
# 二次校验
|
|
119
|
-
new_db_cols = set(get_table_columns(table_name, database))
|
|
120
|
-
|
|
121
|
-
if not df_cols.issubset(new_db_cols):
|
|
122
|
-
raise Exception("字段同步失败")
|
|
123
|
-
|
|
124
122
|
print("字段同步成功")
|
|
125
123
|
|
|
126
124
|
return True
|
|
@@ -128,38 +126,40 @@ def check_and_sync_columns(df, table_name, database, max_new=5):
|
|
|
128
126
|
|
|
129
127
|
# ===================== DataFrame 入库 =====================
|
|
130
128
|
|
|
131
|
-
def update_datas(df, table_name, database):
|
|
129
|
+
def update_datas(df,db_cols, table_name, database):
|
|
132
130
|
|
|
133
131
|
conn = None
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
132
|
+
for i in range(2):
|
|
133
|
+
try:
|
|
134
|
+
# 表结构校验,df为抓取数据表,db_cols为数据库现有字段
|
|
135
|
+
conn = _get_connection(database)
|
|
136
|
+
cursor = conn.cursor()
|
|
137
|
+
cols = list(df.columns)
|
|
138
|
+
col_str = ",".join([f"`{c}`" for c in cols])
|
|
139
|
+
value_tpl = "(" + ",".join(["%s"] * len(cols)) + ")"
|
|
140
|
+
values_str = ",".join([value_tpl] * len(df))
|
|
141
|
+
update_clause = ",".join(
|
|
142
|
+
[f"`{c}`=VALUES(`{c}`)" for c in cols if c != "id"]
|
|
143
|
+
)
|
|
144
|
+
sql = f"""
|
|
145
|
+
INSERT INTO `{table_name}` ({col_str})
|
|
146
|
+
VALUES {values_str}
|
|
147
|
+
ON DUPLICATE KEY UPDATE {update_clause}
|
|
148
|
+
"""
|
|
149
|
+
data = [tuple(row) for row in df.values]
|
|
150
|
+
flat_data = [v for row in data for v in row]
|
|
151
|
+
cursor.execute(sql, flat_data)
|
|
152
|
+
conn.commit()
|
|
153
|
+
print(f"成功插入/更新 {cursor.rowcount} 条记录")
|
|
154
|
+
break
|
|
155
|
+
except Exception as e:
|
|
156
|
+
if conn:
|
|
157
|
+
conn.rollback()
|
|
158
|
+
print("入库失败:", e)
|
|
159
|
+
if '1054, "Unknown column' in str(e):
|
|
160
|
+
check_and_sync_columns(df,db_cols,table_name,database)
|
|
161
|
+
finally:
|
|
162
|
+
if conn:
|
|
163
|
+
conn.close()
|
|
164
164
|
|
|
165
165
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: cppackage
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.3
|
|
4
4
|
Summary: 超品集团自用的Python包
|
|
5
5
|
Home-page: https://github.com/example/CPpackage
|
|
6
6
|
Author: team-数智组
|
|
@@ -40,7 +40,7 @@ CPpackage是超品集团内部使用的Python包,核心功能集中在MySQL数
|
|
|
40
40
|
## 安装
|
|
41
41
|
|
|
42
42
|
```bash
|
|
43
|
-
pip install
|
|
43
|
+
pip install cppackage
|
|
44
44
|
```
|
|
45
45
|
|
|
46
46
|
## 使用方法
|
|
@@ -48,13 +48,16 @@ pip install CPpackage
|
|
|
48
48
|
```python
|
|
49
49
|
# 导入包
|
|
50
50
|
from CPpackage.db.config import set_db_config
|
|
51
|
-
from CPpackage.db.sql_model import sel_data, del_data , get_table_columns,add_columns,check_and_sync_columns,update_datas
|
|
51
|
+
from CPpackage.db.sql_model import sel_data, del_data , incremental_update, get_table_columns,add_columns,check_and_sync_columns,update_datas
|
|
52
|
+
|
|
53
|
+
#
|
|
52
54
|
|
|
53
55
|
# 配置数据库连接(也可通过环境变量CPPACKAGE_DB_*配置)
|
|
54
56
|
set_db_config(host='your_host', user='your_user', password='your_password', database='your_database', port=3306)
|
|
55
57
|
|
|
56
|
-
# 更新数据函数,在完成数据库信息配置后,df为pd.dataframe格式的数据
|
|
57
58
|
# 更新过程会先经过check_and_sync_columns函数完成表格校验
|
|
59
|
+
check_and_sync_columns(df, table_name, database, max_new=5)
|
|
60
|
+
# 更新数据函数,在完成数据库信息配置后,df为pd.dataframe格式的数据
|
|
58
61
|
update_datas(df, table_name, database)
|
|
59
62
|
|
|
60
63
|
```
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
CPpackage/__init__.py,sha256=KpVaXkIzkNDl-dfSX8Rr7z9XFlipxx1nZ_GzS4Qls4I,173
|
|
2
|
+
CPpackage/core/__init__.py,sha256=92mF0310uQ5ujlgd-LCMs5kZVzfGRdcl67GHIRWhHcA,504
|
|
3
|
+
CPpackage/db/__init__.py,sha256=WhrLqsjq97KKHF7YV-HcZf9pRtHuqKhRjXDNPCBVbjY,107
|
|
4
|
+
CPpackage/db/config.py,sha256=wygya2246ph0LY90xikQBVoRxS8vlI-RpWWNGOiUZ5s,723
|
|
5
|
+
CPpackage/db/sql_model.py,sha256=HZV8Zl7ywgBNc9l41rr9tBi7itczsWVrSA1cXw3eYBk,4872
|
|
6
|
+
CPpackage/utils/__init__.py,sha256=sAespT0aoLr3O0WF27DwHLYF60VZgPA1tiT0JJ8s8zI,264
|
|
7
|
+
cppackage-0.2.3.dist-info/licenses/LICENSE,sha256=6Pj597LnvlRtq3Vgjkfp6zgBeBh7wl8jKE-nCFg4vZI,1065
|
|
8
|
+
cppackage-0.2.3.dist-info/METADATA,sha256=s3w4BGnzsiAbda4sy8c_fNcXaQqIqGJ-YKJDG6yR9bo,2516
|
|
9
|
+
cppackage-0.2.3.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
|
|
10
|
+
cppackage-0.2.3.dist-info/entry_points.txt,sha256=SAzF2klkNyeNCqXuiNkDirN999l7v8CGCrHR0StD_oo,50
|
|
11
|
+
cppackage-0.2.3.dist-info/top_level.txt,sha256=FQrfWDbJistWQIrHW_Aoxoy_UWSzjOByWVcVS5ig9Tk,10
|
|
12
|
+
cppackage-0.2.3.dist-info/RECORD,,
|
cppackage-0.2.1.dist-info/RECORD
DELETED
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
CPpackage/__init__.py,sha256=KpVaXkIzkNDl-dfSX8Rr7z9XFlipxx1nZ_GzS4Qls4I,173
|
|
2
|
-
CPpackage/core/__init__.py,sha256=92mF0310uQ5ujlgd-LCMs5kZVzfGRdcl67GHIRWhHcA,504
|
|
3
|
-
CPpackage/db/__init__.py,sha256=Uw09n27c0k2lM61oYw0GMpnbIafPKiY9EAMudxBn7IY,164
|
|
4
|
-
CPpackage/db/config.py,sha256=wygya2246ph0LY90xikQBVoRxS8vlI-RpWWNGOiUZ5s,723
|
|
5
|
-
CPpackage/db/sql_model.py,sha256=qj8NQctWkIJbdnLYDfg2mpOKl-STlz1lbaeiV9D-JY0,4433
|
|
6
|
-
CPpackage/utils/__init__.py,sha256=sAespT0aoLr3O0WF27DwHLYF60VZgPA1tiT0JJ8s8zI,264
|
|
7
|
-
cppackage-0.2.1.dist-info/licenses/LICENSE,sha256=6Pj597LnvlRtq3Vgjkfp6zgBeBh7wl8jKE-nCFg4vZI,1065
|
|
8
|
-
cppackage-0.2.1.dist-info/METADATA,sha256=UBo6vBIsitJAUXFX4j3RSnF44QlnIof9LnZ0frzQ8eQ,2429
|
|
9
|
-
cppackage-0.2.1.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
|
|
10
|
-
cppackage-0.2.1.dist-info/entry_points.txt,sha256=SAzF2klkNyeNCqXuiNkDirN999l7v8CGCrHR0StD_oo,50
|
|
11
|
-
cppackage-0.2.1.dist-info/top_level.txt,sha256=FQrfWDbJistWQIrHW_Aoxoy_UWSzjOByWVcVS5ig9Tk,10
|
|
12
|
-
cppackage-0.2.1.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|