Files
F6--/张阳脚本/异常待办测试.ipynb
T
2026-01-30 11:28:35 +08:00

1160 lines
63 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"id": "edb7efb2",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"开始创建表 sms_verification_result_bi_V4...\n",
"表创建成功!\n",
"\n",
"表结构详情:\n",
"字段名: 主键, 类型: int(11), 注释: 无注释\n",
"字段名: 申请来源, 类型: varchar(255), 注释: 无注释\n",
"字段名: 操作日期字符串, 类型: varchar(100), 注释: 无注释\n",
"字段名: 审核信息, 类型: text, 注释: 无注释\n",
"字段名: 资质名称, 类型: varchar(255), 注释: 无注释\n",
"字段名: 签署来源, 类型: varchar(255), 注释: 无注释\n",
"字段名: 签署代码, 类型: varchar(255), 注释: 无注释\n",
"字段名: 资质编号, 类型: varchar(255), 注释: 无注释\n",
"字段名: 订单编号, 类型: varchar(255), 注释: 无注释\n",
"字段名: 签署名称, 类型: varchar(255), 注释: 无注释\n",
"字段名: 备注, 类型: text, 注释: 无注释\n",
"字段名: 编号, 类型: varchar(255), 注释: 无注释\n",
"字段名: 创建时间字符串, 类型: varchar(100), 注释: 无注释\n",
"字段名: 是否默认签署, 类型: tinyint(1), 注释: 无注释\n",
"字段名: 审核备注信息, 类型: text, 注释: 无注释\n",
"字段名: 订单数量, 类型: int(11), 注释: 无注释\n",
"字段名: 审核状态, 类型: varchar(50), 注释: 无注释\n",
"字段名: 扩展信息, 类型: text, 注释: 无注释\n",
"字段名: 签署类型, 类型: varchar(50), 注释: 无注释\n",
"字段名: 是否可注册, 类型: tinyint(1), 注释: 无注释\n",
"字段名: 签署场景详情列表。签署场景详情, 类型: text, 注释: 无注释\n",
"字段名: 文件ID列表。文件ID, 类型: text, 注释: 无注释\n",
"字段名: 文件URL列表。文件URL, 类型: text, 注释: 无注释\n",
"字段名: 场景类型, 类型: varchar(50), 注释: 无注释\n",
"字段名: 服务类型, 类型: varchar(50), 注释: 无注释\n",
"字段名: 注册结果, 类型: varchar(50), 注释: 无注释\n",
"字段名: 资质状态, 类型: varchar(50), 注释: 无注释\n",
"字段名: 电信注册状态, 类型: varchar(50), 注释: 无注释\n",
"字段名: 移动注册状态, 类型: varchar(50), 注释: 无注释\n",
"字段名: 联通注册状态, 类型: varchar(50), 注释: 无注释\n",
"字段名: 聚合注册状态, 类型: varchar(50), 注释: 无注释\n",
"字段名: 资质工单编号, 类型: varchar(255), 注释: 无注释\n",
"字段名: 授权, 类型: text, 注释: 无注释\n",
"字段名: 启用授权书, 类型: tinyint(1), 注释: 无注释\n",
"字段名: 组织机构代码, 类型: varchar(50), 注释: 无注释\n",
"字段名: 资质版本, 类型: varchar(50), 注释: 无注释\n",
"字段名: 授权书, 类型: text, 注释: 无注释\n",
"字段名: 授权书审核通过, 类型: tinyint(1), 注释: 无注释\n",
"字段名: 授权书编号, 类型: varchar(255), 注释: 无注释\n",
"字段名: 授权签署范围, 类型: text, 注释: 无注释\n",
"字段名: 授权书名称, 类型: varchar(255), 注释: 无注释\n",
"字段名: 授权生效时间, 类型: datetime, 注释: 无注释\n",
"字段名: 委托授权, 类型: text, 注释: 无注释\n",
"字段名: 授权书状态, 类型: varchar(50), 注释: 无注释\n",
"字段名: 结果原因, 类型: text, 注释: 无注释\n",
"字段名: 创建时间, 类型: datetime, 注释: CURRENT_TIMESTAMP\n",
"字段名: 更新时间, 类型: datetime, 注释: CURRENT_TIMESTAMP\n",
"表创建操作完成\n"
]
}
],
"source": [
"import mysql.connector\n",
"from mysql.connector import Error\n",
"\n",
"def create_sms_verification_table():\n",
" \"\"\"创建短信验证结果表 sms_verification_result_bi_V4\"\"\"\n",
" print(\"开始创建表 sms_verification_result_bi_V4...\")\n",
" \n",
" # 数据库连接配置(请根据实际情况修改)\n",
" config = {\n",
" \"host\": \"rm-uf6r230vbtxf5gdz63o.mysql.rds.aliyuncs.com\",\n",
" \"user\": \"rw_operation_data_relay\",\n",
" \"password\": \"m+q5Z4%IVuF9bf\",\n",
" \"database\": \"f6operation_data_relay\"\n",
" }\n",
" \n",
" # 表结构定义(基于字段映射关系构建)\n",
" table_ddl = \"\"\"\n",
" CREATE TABLE IF NOT EXISTS sms_verification_result_bi_V4 (\n",
" `主键` INT(11) NOT NULL AUTO_INCREMENT COMMENT '自增主键',\n",
" `申请来源` VARCHAR(255) DEFAULT NULL COMMENT '短信签名的申请来源',\n",
" `操作日期字符串` VARCHAR(100) DEFAULT NULL COMMENT '操作日期的字符串表示',\n",
" `审核信息` TEXT COMMENT '审核相关详细信息',\n",
" `资质名称` VARCHAR(255) DEFAULT NULL COMMENT '关联资质的名称',\n",
" `签署来源` VARCHAR(255) DEFAULT NULL COMMENT '签名的来源类型',\n",
" `签署代码` VARCHAR(255) DEFAULT NULL COMMENT '签名的唯一代码标识',\n",
" `资质编号` VARCHAR(255) DEFAULT NULL COMMENT '资质的唯一编号',\n",
" `订单编号` VARCHAR(255) DEFAULT NULL COMMENT '关联订单的编号',\n",
" `签署名称` VARCHAR(255) DEFAULT NULL COMMENT '签名的显示名称',\n",
" `备注` TEXT COMMENT '附加备注信息',\n",
" `编号` VARCHAR(255) DEFAULT NULL COMMENT '签名的系统编号',\n",
" `创建时间字符串` VARCHAR(100) DEFAULT NULL COMMENT '创建时间的字符串格式',\n",
" `是否默认签署` TINYINT(1) DEFAULT NULL COMMENT '是否为默认签名(1是/0否)',\n",
" `审核备注信息` TEXT COMMENT '审核过程中的备注说明',\n",
" `订单数量` INT(11) DEFAULT NULL COMMENT '关联订单的数量',\n",
" `审核状态` VARCHAR(50) DEFAULT NULL COMMENT '当前审核状态',\n",
" `扩展信息` TEXT COMMENT '额外扩展字段',\n",
" `签署类型` VARCHAR(50) DEFAULT NULL COMMENT '签名的类型分类',\n",
" `是否可注册` TINYINT(1) DEFAULT NULL COMMENT '是否允许注册(1是/0否)',\n",
" `签署场景详情列表。签署场景详情` TEXT COMMENT '签署场景详情的JSON列表',\n",
" `文件ID列表。文件ID` TEXT COMMENT '文件ID的JSON列表',\n",
" `文件URL列表。文件URL` TEXT COMMENT '文件URL的JSON列表',\n",
" `场景类型` VARCHAR(50) DEFAULT NULL COMMENT '业务场景的类型',\n",
" `服务类型` VARCHAR(50) DEFAULT NULL COMMENT '服务的类型分类',\n",
" `注册结果` VARCHAR(50) DEFAULT NULL COMMENT '注册操作的结果',\n",
" `资质状态` VARCHAR(50) DEFAULT NULL COMMENT '资质的当前状态',\n",
" `电信注册状态` VARCHAR(50) DEFAULT NULL COMMENT '电信渠道注册状态',\n",
" `移动注册状态` VARCHAR(50) DEFAULT NULL COMMENT '移动渠道注册状态',\n",
" `联通注册状态` VARCHAR(50) DEFAULT NULL COMMENT '联通渠道注册状态',\n",
" `聚合注册状态` VARCHAR(50) DEFAULT NULL COMMENT '聚合渠道注册状态',\n",
" `资质工单编号` VARCHAR(255) DEFAULT NULL COMMENT '资质工单的唯一编号',\n",
" `授权` TEXT COMMENT '授权信息的JSON结构',\n",
" `启用授权书` TINYINT(1) DEFAULT NULL COMMENT '是否启用授权书(1是/0否)',\n",
" `组织机构代码` VARCHAR(50) DEFAULT NULL COMMENT '组织机构的代码',\n",
" `资质版本` VARCHAR(50) DEFAULT NULL COMMENT '资质的版本号',\n",
" `授权书` TEXT COMMENT '授权书内容的JSON结构',\n",
" `授权书审核通过` TINYINT(1) DEFAULT NULL COMMENT '授权书是否审核通过(1是/0否)',\n",
" `授权书编号` VARCHAR(255) DEFAULT NULL COMMENT '授权书的唯一编号',\n",
" `授权签署范围` TEXT COMMENT '授权签署范围的JSON结构',\n",
" `授权书名称` VARCHAR(255) DEFAULT NULL COMMENT '授权书的显示名称',\n",
" `授权生效时间` DATETIME DEFAULT NULL COMMENT '授权生效的具体时间',\n",
" `委托授权` TEXT COMMENT '委托授权信息的JSON结构',\n",
" `授权书状态` VARCHAR(50) DEFAULT NULL COMMENT '授权书的当前状态',\n",
" `结果原因` TEXT COMMENT '操作结果的原因说明',\n",
" `创建时间` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '记录创建时间',\n",
" `更新时间` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '记录更新时间',\n",
" PRIMARY KEY (`主键`),\n",
" KEY `idx_签署名称` (`签署名称`),\n",
" KEY `idx_审核状态` (`审核状态`),\n",
" KEY `idx_创建时间` (`创建时间`)\n",
" ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='短信验证结果BI表V4'\n",
" \"\"\"\n",
" \n",
" try:\n",
" # 建立数据库连接\n",
" connection = mysql.connector.connect(**config)\n",
" cursor = connection.cursor()\n",
" \n",
" # 执行建表语句\n",
" cursor.execute(table_ddl)\n",
" connection.commit()\n",
" print(\"表创建成功!\")\n",
" \n",
" # 验证表结构\n",
" cursor.execute(\"DESCRIBE sms_verification_result_bi_V4\")\n",
" columns = cursor.fetchall()\n",
" print(\"\\n表结构详情:\")\n",
" for col in columns:\n",
" print(f\"字段名: {col[0]}, 类型: {col[1]}, 注释: {col[4] if col[4] else '无注释'}\")\n",
" \n",
" except Error as e:\n",
" print(f\"建表失败,错误信息: {e}\")\n",
" finally:\n",
" # 释放资源\n",
" if 'cursor' in locals() and cursor:\n",
" cursor.close()\n",
" if 'connection' in locals() and connection.is_connected():\n",
" connection.close()\n",
" print(\"表创建操作完成\")\n",
"\n",
"if __name__ == \"__main__\":\n",
" create_sms_verification_table()"
]
},
{
"cell_type": "code",
"id": "ba75f5f9",
"metadata": {
"ExecuteTime": {
"end_time": "2025-06-26T07:12:50.631796Z",
"start_time": "2025-06-26T06:59:33.941369Z"
}
},
"source": [
"import pandas as pd\n",
"import requests\n",
"import json\n",
"import math\n",
"import time\n",
"import random\n",
"from datetime import datetime\n",
"import mysql.connector\n",
"from mysql.connector import Error\n",
"\n",
"\n",
"# 第一步:获取登录信息\n",
"print(\"正在获取登录信息...\")\n",
"data = {\n",
" 'api_key': '675b900991ad2491c69389ca',\n",
" 'entry_id': '6851093ebdfde576a200904b',\n",
" 'data_id': '685109741b2f2e58e67ee983'\n",
"}\n",
"url = 'https://api.jiandaoyun.com/api/v5/app/entry/data/get'\n",
"headers = {\n",
" 'Authorization': 'Bearer qygHulymo1fekJk4CIZyNKjyQAzG8CFN',\n",
" 'Content-Type': 'application/json'\n",
"}\n",
"payload = json.dumps({\n",
" \"app_id\": data['api_key'],\n",
" \"entry_id\": data['entry_id'],\n",
" \"data_id\": data['data_id']\n",
"})\n",
"login_info = None\n",
"sec_token_info = None\n",
"try:\n",
" res = requests.post(url=url, data=payload, headers=headers)\n",
" res.raise_for_status()\n",
" response_data = res.json()\n",
" login_info = response_data['data']['_widget_1750141246569']\n",
" sec_token_info = response_data['data']['_widget_1750152831412']\n",
" print(\"成功获取登录信息\")\n",
"except requests.exceptions.RequestException as e:\n",
" print(f\"获取登录信息出错: {e}\")\n",
"if not login_info:\n",
" print(\"获取登录信息失败,程序退出\")\n",
" exit()\n",
"\n",
"# 第二步:使用登录信息设置请求头和Cookie\n",
"print(\"正在设置请求配置...\")\n",
"cookie_dict = None\n",
"headers_config = None\n",
"base_payload = None\n",
"cookies_str = login_info\n",
"cookie_dict = {item.split('=')[0]: item.split('=')[1] for item in cookies_str.split('; ')}\n",
"headers_config = {\n",
" \"Accept\": \"application/json\",\n",
" \"Accept-Encoding\": \"gzip, deflate, br\",\n",
" \"Accept-Language\": \"zh-CN,zh;q=0.9,en;q=0.8,zh-TW;q=0.7\",\n",
" \"BX-V\": \"2.5.31\",\n",
" \"Content-Type\": \"application/x-www-form-urlencoded\",\n",
" \"Origin\": \"https://dysms.console.aliyun.com\",\n",
" \"Referer\": \"https://dysms.console.aliyun.com/domestic/text/sign\",\n",
" \"Sec-Fetch-Dest\": \"empty\",\n",
" \"Sec-Fetch-Mode\": \"cors\",\n",
" \"Sec-Fetch-Site\": \"same-origin\",\n",
" \"User-Agent\": \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36\",\n",
" \"X-Requested-With\": \"XMLHttpRequest\",\n",
"}\n",
"base_payload = {\n",
" \"action\": \"QuerySmsSignListNew\",\n",
" \"product\": \"dysms20170620\",\n",
" \"umid\": \"Yd5db6b19b3dfb7cc4c8e6dec178299b0\",\n",
" \"collina\": \"140#n2OosMD0zzP/BQo2KiWFwtSraeCmHr0yx2jLKUbQgtSjgmkcPBleV9tNmHR+OQzslmr4Xj7JXqHee5vbt5Izlp1zzXBTbqQsmFzxyLkd7tEtzzrb22U3l61fnlJnhIlqHb4y2YqK23Mfx4uS9OSGUESKIIaR0wBiqBT+xVcxnZZqzFFI2XMvl6TxoH23b12V2br+2jSE+3h7zuDH2O5wlpTPzqfx+20qOSvZrI7ZbIU2PnGvrILp8HmekTAXpPEccpRksjA8l86DLtdJPJLP8tz6seXsDkPgKiHERujpvrVN0e+3xi7mGTz8KgKylmkOfGi71hufyh7UDf3/ENDy0T8L6ocZyHGPHi5FCO05wBOsbNxyxnr/LD8fxJn5Qk6FuDTTOHuRDE/8N7u9xNIonCjL83P9YZd7ssonCMZw7CkY0An1DSnUvDn2ctAFcRlheDbxcfgbbnpzt6+D/DII+Tzy1oD2EjR8anlVUO1Lf3weKhlcg42moUdqkA4yftFah/JSddp3c6Teho0t83y4VsjvbqHrVnLgp+fATPDD7JdS04zxZMUz1Dx++68QPmdIrtitA6EMxCmYwFPikJdAni36+5Du6xzYjmrxRhWzlpnHuAr0VvMky7egMHmEnIvfvoVKcy+cdr0uct3FcPk2FEOcriD+R/C8GdhSXzDmrCdOj6I6XH9GLsssZFbSBxjpImF8iDgid7cJ3Kx8R2PJFYBDmLcnUDrZ74N9BeD0ONxM+jBvrt2Al1usdrv8U7ibnbxVePEEMmX/IN3y2x43n6OTo+L2EQI4wBaPVTrhyj3mfHzNOg3mti7vwOA+IuU8+aznKJeymlRKbKCH4uKFBQZZGo5gFv15xuX16+prnhWLpNEBr9MYMteNrCE+qYjWBqouvBV2SLs+tnGGfizDI+hZ+lGDcz9NWCSYPVdTAMeOWtCY8a4fkbQNgw+Q1lFP1X+no3wFKHut7nBNo2hyCrcZXFgrtE1LCGYMb27H\",\n",
" \"sec_token\": sec_token_info\n",
"}\n",
"\n",
"# 第三步:首次查询获取总记录数\n",
"print(\"正在获取总记录数...\")\n",
"api_url = \"https://dysms.console.aliyun.com/data/api.json?action=QuerySmsSignListNew\"\n",
"params = '{\"PageNo\":1,\"PageSize\":1,\"ServiceType\":\"0,1\",\"IsGlobeSign\":0}'\n",
"payload = base_payload.copy()\n",
"payload[\"params\"] = params\n",
"total_records = 0\n",
"try:\n",
" res = requests.post(api_url, cookies=cookie_dict, headers=headers_config, data=payload)\n",
" res.raise_for_status()\n",
" response_data = res.json()\n",
" total_records = response_data['data']['Total']\n",
" print(f\"共获取到 {total_records} 条记录\")\n",
"except requests.exceptions.RequestException as e:\n",
" print(f\"首次查询出错: {e}\")\n",
"if total_records == 0:\n",
" print(\"获取总记录数失败,程序退出\")\n",
" exit()\n",
"\n",
"# 第四步:计算总页数并准备查询\n",
"page_size = 100\n",
"total_pages = math.ceil(total_records / page_size)\n",
"print(f\"共 {total_pages} 页数据需要查询\")\n",
"all_data = []\n",
"\n",
"# 第五步:循环查询每一页数据\n",
"print(\"开始逐页查询数据...\")\n",
"for page in range(1, total_pages + 1):\n",
" print(f\"正在查询第 {page}/{total_pages} 页...\")\n",
" params = f'{{\"PageNo\":{page},\"PageSize\":{page_size},\"ServiceType\":\"0,1\",\"IsGlobeSign\":0}}'\n",
" payload = base_payload.copy()\n",
" payload[\"params\"] = params\n",
" page_data = []\n",
" try:\n",
" time.sleep(random.uniform(1, 3))\n",
" res = requests.post(api_url, cookies=cookie_dict, headers=headers_config, data=payload)\n",
" res.raise_for_status()\n",
" response_data = res.json()\n",
" page_data = response_data.get('data', {}).get('SmsSign', {}).get('SmsSign', [])\n",
" except requests.exceptions.RequestException as e:\n",
" print(f\"第 {page} 页查询出错: {e}\")\n",
" all_data.extend(page_data)\n",
" print(f\"第 {page} 页查询完成,获取 {len(page_data)} 条记录\")\n",
"print(f\"所有数据查询完成,共获取 {len(all_data)} 条记录\")\n",
"\n",
"# 第六步:数据处理与列名转换\n",
"print(\"正在处理数据...\")\n",
"if not all_data:\n",
" print(\"没有数据可处理,程序退出\")\n",
" exit()\n",
"df = pd.json_normalize(all_data)\n",
"\n",
"# 定义字段映射关系(英文到中文)\n",
"field_mapping = {\n",
" \"ApplySource\": \"申请来源\",\n",
" \"OperateDateStr\": \"操作日期字符串\",\n",
" \"AuditInfo\": \"审核信息\",\n",
" \"QualificationName\": \"资质名称\",\n",
" \"SignSource\": \"签署来源\",\n",
" \"SignCode\": \"签署代码\",\n",
" \"QualificationId\": \"资质编号\",\n",
" \"OrderId\": \"订单编号\",\n",
" \"SignName\": \"签署名称\",\n",
" \"Remark\": \"备注\",\n",
" \"Id\": \"编号\",\n",
" \"GmtCreateStr\": \"创建时间字符串\",\n",
" \"IsDefaultSign\": \"是否默认签署\",\n",
" \"AuditRemarkInfo\": \"审核备注信息\",\n",
" \"OrderCount\": \"订单数量\",\n",
" \"AuditState\": \"审核状态\",\n",
" \"ExtendMessage\": \"扩展信息\",\n",
" \"SignType\": \"签署类型\",\n",
" \"CanRegister\": \"是否可注册\",\n",
" \"SignSceneDetailList.SignSceneDetail\": \"签署场景详情列表。签署场景详情\",\n",
" \"FileIds.FileId\": \"文件ID列表。文件ID\",\n",
" \"FileUrlList.FileUrl\": \"文件URL列表。文件URL\",\n",
" \"SceneType\": \"场景类型\",\n",
" \"ServiceType\": \"服务类型\",\n",
" \"RegisterResult\": \"注册结果\",\n",
" \"QualificationState\": \"资质状态\",\n",
" \"TelecomRegisterStatus\": \"电信注册状态\",\n",
" \"MobileRegisterStatus\": \"移动注册状态\",\n",
" \"UnicomRegisterStatus\": \"联通注册状态\",\n",
" \"AggregatedRegisterStatus\": \"聚合注册状态\",\n",
" \"QualificationWorkOrderId\": \"资质工单编号\",\n",
" \"Authorization\": \"授权\",\n",
" \"EnableAuthorizationLetter\": \"启用授权书\",\n",
" \"OrganizationCode\": \"组织机构代码\",\n",
" \"QualificationVersion\": \"资质版本\",\n",
" \"AuthorizationLetter\": \"授权书\",\n",
" \"AuthorizationLetterAuditPass\": \"授权书审核通过\",\n",
" \"AuthorizationLetterId\": \"授权书编号\",\n",
" \"AuthorizationSignScope\": \"授权签署范围\",\n",
" \"AuthorizationLetterName\": \"授权书名称\",\n",
" \"AuthorizationEffTime\": \"授权生效时间\",\n",
" \"ProxyAuthorization\": \"委托授权\",\n",
" \"AuthorizationLetterStatus\": \"授权书状态\",\n",
" \"ResultReason\": \"结果原因\"\n",
"}\n",
"\n",
"# 连接数据库获取表结构\n",
"host = \"rm-uf6r230vbtxf5gdz63o.mysql.rds.aliyuncs.com\"\n",
"user = \"rw_operation_data_relay\"\n",
"password = \"m+q5Z4%IVuF9bf\"\n",
"database = \"f6operation_data_relay\"\n",
"connection = mysql.connector.connect(\n",
" host=host,\n",
" user=user,\n",
" password=password,\n",
" database=database\n",
")\n",
"cursor = connection.cursor()\n",
"table_name = 'sms_verification_result_bi_V5'\n",
"cursor.execute(f\"DESCRIBE {table_name}\")\n",
"table_columns = [col[0] for col in cursor.fetchall()]\n",
"df = df.rename(columns=field_mapping)\n",
"# 按表结构创建DataFrame并填充数据\n",
"target_df = pd.DataFrame(columns=table_columns)\n",
"common_columns = [col for col in table_columns if col in df.columns]\n",
"for col in common_columns:\n",
" target_df[col] = df[col]\n",
"missing_columns = [col for col in table_columns if col not in df.columns]\n",
"for col in missing_columns:\n",
" target_df[col] = None\n",
"df = target_df\n",
"\n",
"# 处理嵌套字段\n",
"# nested_fields = [\"签署场景详情列表。签署场景详情\", \"文件ID列表。文件ID\"]\n",
"# for field in nested_fields:\n",
"# if field in df.columns:\n",
"# df[field] = df[field].apply(json.dumps)\n",
"\n",
"# 第七步:保存到Excel\n",
"df = df.drop(\"主键\", axis=1)\n",
"# df.to_excel(r'C:\\Users\\admin\\Downloads\\2222222222.xlsx', index=False)\n",
"print(f\"数据已成功保存\")\n",
"# 将所有列表或字典类型的列转换为 JSON 字符串\n",
"for col in df.columns:\n",
" if df[col].apply(type).isin([list, dict]).any():\n",
" df[col] = df[col].apply(json.dumps)\n",
"# 第八步:导入数据到MySQL\n",
"print(\"正在导入数据到MySQL...\")\n"
],
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"正在获取登录信息...\n",
"成功获取登录信息\n",
"正在设置请求配置...\n",
"正在获取总记录数...\n",
"共获取到 10004 条记录\n",
"共 101 页数据需要查询\n",
"开始逐页查询数据...\n",
"正在查询第 1/101 页...\n",
"第 1 页查询完成,获取 100 条记录\n",
"正在查询第 2/101 页...\n",
"第 2 页查询完成,获取 100 条记录\n",
"正在查询第 3/101 页...\n",
"第 3 页查询完成,获取 100 条记录\n",
"正在查询第 4/101 页...\n",
"第 4 页查询完成,获取 100 条记录\n",
"正在查询第 5/101 页...\n",
"第 5 页查询完成,获取 100 条记录\n",
"正在查询第 6/101 页...\n",
"第 6 页查询完成,获取 100 条记录\n",
"正在查询第 7/101 页...\n",
"第 7 页查询完成,获取 100 条记录\n",
"正在查询第 8/101 页...\n",
"第 8 页查询完成,获取 100 条记录\n",
"正在查询第 9/101 页...\n",
"第 9 页查询完成,获取 100 条记录\n",
"正在查询第 10/101 页...\n",
"第 10 页查询完成,获取 100 条记录\n",
"正在查询第 11/101 页...\n",
"第 11 页查询完成,获取 100 条记录\n",
"正在查询第 12/101 页...\n",
"第 12 页查询完成,获取 100 条记录\n",
"正在查询第 13/101 页...\n",
"第 13 页查询完成,获取 100 条记录\n",
"正在查询第 14/101 页...\n",
"第 14 页查询完成,获取 100 条记录\n",
"正在查询第 15/101 页...\n",
"第 15 页查询完成,获取 100 条记录\n",
"正在查询第 16/101 页...\n",
"第 16 页查询完成,获取 100 条记录\n",
"正在查询第 17/101 页...\n",
"第 17 页查询完成,获取 100 条记录\n",
"正在查询第 18/101 页...\n",
"第 18 页查询完成,获取 100 条记录\n",
"正在查询第 19/101 页...\n",
"第 19 页查询完成,获取 100 条记录\n",
"正在查询第 20/101 页...\n",
"第 20 页查询完成,获取 100 条记录\n",
"正在查询第 21/101 页...\n",
"第 21 页查询完成,获取 100 条记录\n",
"正在查询第 22/101 页...\n",
"第 22 页查询完成,获取 100 条记录\n",
"正在查询第 23/101 页...\n",
"第 23 页查询完成,获取 100 条记录\n",
"正在查询第 24/101 页...\n",
"第 24 页查询完成,获取 100 条记录\n",
"正在查询第 25/101 页...\n",
"第 25 页查询完成,获取 100 条记录\n",
"正在查询第 26/101 页...\n",
"第 26 页查询完成,获取 100 条记录\n",
"正在查询第 27/101 页...\n",
"第 27 页查询完成,获取 100 条记录\n",
"正在查询第 28/101 页...\n",
"第 28 页查询完成,获取 100 条记录\n",
"正在查询第 29/101 页...\n",
"第 29 页查询完成,获取 100 条记录\n",
"正在查询第 30/101 页...\n",
"第 30 页查询完成,获取 100 条记录\n",
"正在查询第 31/101 页...\n",
"第 31 页查询完成,获取 100 条记录\n",
"正在查询第 32/101 页...\n",
"第 32 页查询完成,获取 100 条记录\n",
"正在查询第 33/101 页...\n",
"第 33 页查询完成,获取 100 条记录\n",
"正在查询第 34/101 页...\n",
"第 34 页查询完成,获取 100 条记录\n",
"正在查询第 35/101 页...\n",
"第 35 页查询完成,获取 100 条记录\n",
"正在查询第 36/101 页...\n",
"第 36 页查询完成,获取 100 条记录\n",
"正在查询第 37/101 页...\n",
"第 37 页查询完成,获取 100 条记录\n",
"正在查询第 38/101 页...\n",
"第 38 页查询完成,获取 100 条记录\n",
"正在查询第 39/101 页...\n",
"第 39 页查询完成,获取 100 条记录\n",
"正在查询第 40/101 页...\n",
"第 40 页查询完成,获取 100 条记录\n",
"正在查询第 41/101 页...\n",
"第 41 页查询完成,获取 100 条记录\n",
"正在查询第 42/101 页...\n",
"第 42 页查询完成,获取 100 条记录\n",
"正在查询第 43/101 页...\n",
"第 43 页查询完成,获取 100 条记录\n",
"正在查询第 44/101 页...\n",
"第 44 页查询完成,获取 100 条记录\n",
"正在查询第 45/101 页...\n",
"第 45 页查询完成,获取 100 条记录\n",
"正在查询第 46/101 页...\n",
"第 46 页查询完成,获取 100 条记录\n",
"正在查询第 47/101 页...\n",
"第 47 页查询完成,获取 100 条记录\n",
"正在查询第 48/101 页...\n",
"第 48 页查询完成,获取 100 条记录\n",
"正在查询第 49/101 页...\n",
"第 49 页查询完成,获取 100 条记录\n",
"正在查询第 50/101 页...\n",
"第 50 页查询完成,获取 100 条记录\n",
"正在查询第 51/101 页...\n",
"第 51 页查询完成,获取 100 条记录\n",
"正在查询第 52/101 页...\n",
"第 52 页查询完成,获取 100 条记录\n",
"正在查询第 53/101 页...\n",
"第 53 页查询完成,获取 100 条记录\n",
"正在查询第 54/101 页...\n",
"第 54 页查询完成,获取 100 条记录\n",
"正在查询第 55/101 页...\n",
"第 55 页查询完成,获取 100 条记录\n",
"正在查询第 56/101 页...\n",
"第 56 页查询完成,获取 100 条记录\n",
"正在查询第 57/101 页...\n",
"第 57 页查询完成,获取 100 条记录\n",
"正在查询第 58/101 页...\n",
"第 58 页查询完成,获取 100 条记录\n",
"正在查询第 59/101 页...\n",
"第 59 页查询完成,获取 100 条记录\n",
"正在查询第 60/101 页...\n",
"第 60 页查询完成,获取 100 条记录\n",
"正在查询第 61/101 页...\n",
"第 61 页查询完成,获取 100 条记录\n",
"正在查询第 62/101 页...\n",
"第 62 页查询完成,获取 100 条记录\n",
"正在查询第 63/101 页...\n",
"第 63 页查询完成,获取 100 条记录\n",
"正在查询第 64/101 页...\n",
"第 64 页查询完成,获取 100 条记录\n",
"正在查询第 65/101 页...\n",
"第 65 页查询完成,获取 100 条记录\n",
"正在查询第 66/101 页...\n",
"第 66 页查询完成,获取 100 条记录\n",
"正在查询第 67/101 页...\n",
"第 67 页查询完成,获取 100 条记录\n",
"正在查询第 68/101 页...\n",
"第 68 页查询完成,获取 100 条记录\n",
"正在查询第 69/101 页...\n",
"第 69 页查询完成,获取 100 条记录\n",
"正在查询第 70/101 页...\n",
"第 70 页查询完成,获取 100 条记录\n",
"正在查询第 71/101 页...\n",
"第 71 页查询完成,获取 100 条记录\n",
"正在查询第 72/101 页...\n",
"第 72 页查询完成,获取 100 条记录\n",
"正在查询第 73/101 页...\n",
"第 73 页查询完成,获取 100 条记录\n",
"正在查询第 74/101 页...\n",
"第 74 页查询完成,获取 100 条记录\n",
"正在查询第 75/101 页...\n",
"第 75 页查询完成,获取 100 条记录\n",
"正在查询第 76/101 页...\n",
"第 76 页查询完成,获取 100 条记录\n",
"正在查询第 77/101 页...\n",
"第 77 页查询完成,获取 100 条记录\n",
"正在查询第 78/101 页...\n",
"第 78 页查询完成,获取 100 条记录\n",
"正在查询第 79/101 页...\n",
"第 79 页查询完成,获取 100 条记录\n",
"正在查询第 80/101 页...\n",
"第 80 页查询完成,获取 100 条记录\n",
"正在查询第 81/101 页...\n",
"第 81 页查询完成,获取 100 条记录\n",
"正在查询第 82/101 页...\n",
"第 82 页查询完成,获取 100 条记录\n",
"正在查询第 83/101 页...\n",
"第 83 页查询完成,获取 100 条记录\n",
"正在查询第 84/101 页...\n",
"第 84 页查询完成,获取 100 条记录\n",
"正在查询第 85/101 页...\n",
"第 85 页查询完成,获取 100 条记录\n",
"正在查询第 86/101 页...\n",
"第 86 页查询完成,获取 100 条记录\n",
"正在查询第 87/101 页...\n",
"第 87 页查询完成,获取 100 条记录\n",
"正在查询第 88/101 页...\n",
"第 88 页查询完成,获取 100 条记录\n",
"正在查询第 89/101 页...\n",
"第 89 页查询完成,获取 100 条记录\n",
"正在查询第 90/101 页...\n",
"第 90 页查询完成,获取 100 条记录\n",
"正在查询第 91/101 页...\n",
"第 91 页查询完成,获取 100 条记录\n",
"正在查询第 92/101 页...\n",
"第 92 页查询完成,获取 100 条记录\n",
"正在查询第 93/101 页...\n",
"第 93 页查询完成,获取 100 条记录\n",
"正在查询第 94/101 页...\n",
"第 94 页查询完成,获取 100 条记录\n",
"正在查询第 95/101 页...\n",
"第 95 页查询完成,获取 100 条记录\n",
"正在查询第 96/101 页...\n",
"第 96 页查询完成,获取 100 条记录\n",
"正在查询第 97/101 页...\n",
"第 97 页查询完成,获取 100 条记录\n",
"正在查询第 98/101 页...\n",
"第 98 页查询完成,获取 100 条记录\n",
"正在查询第 99/101 页...\n",
"第 99 页查询完成,获取 100 条记录\n",
"正在查询第 100/101 页...\n",
"第 100 页查询完成,获取 100 条记录\n",
"正在查询第 101/101 页...\n",
"第 101 页查询完成,获取 4 条记录\n",
"所有数据查询完成,共获取 10004 条记录\n",
"正在处理数据...\n",
"数据已成功保存\n",
"正在导入数据到MySQL...\n"
]
}
],
"execution_count": 1
},
{
"cell_type": "code",
"id": "c8f82c25",
"metadata": {
"ExecuteTime": {
"end_time": "2025-06-26T07:13:53.162919Z",
"start_time": "2025-06-26T07:13:53.011192Z"
}
},
"source": "df.to_csv(r'D:\\Idea Project\\F6+宜搭+其它(1)\\new\\文件输出\\2222222222.csv', index=False)",
"outputs": [],
"execution_count": 2
},
{
"cell_type": "code",
"id": "cd1279ac",
"metadata": {
"ExecuteTime": {
"end_time": "2025-06-26T07:46:02.953714Z",
"start_time": "2025-06-26T07:45:01.764208Z"
}
},
"source": [
"table_name = 'sms_verification_result_bi_V5'\n",
"if df.empty:\n",
" print(\"没有数据可导入\")\n",
"else:\n",
" try:\n",
" connection = mysql.connector.connect(\n",
" host=host,\n",
" user=user,\n",
" password=password,\n",
" database=database\n",
" )\n",
" cursor = connection.cursor()\n",
" \n",
" # 清空表数据\n",
" clear_table_query = f\"TRUNCATE TABLE {table_name};\"\n",
" cursor.execute(clear_table_query)\n",
" print(f\"已清空表 {table_name} 数据\")\n",
"\n",
" # 处理数据(NaN转None\n",
" def process_value(value):\n",
" if pd.isna(value):\n",
" return None\n",
" return value\n",
" \n",
" # 逐行处理数据,确保所有NaN都被替换为None\n",
" records = []\n",
" for row in df.values:\n",
" processed_row = [process_value(value) for value in row]\n",
" records.append(tuple(processed_row))\n",
"\n",
" # 生成插入语句\n",
" columns = ', '.join(df.columns)\n",
" placeholders = ', '.join(['%s'] * len(df.columns))\n",
" \n",
" # 使用 REPLACE INTO 处理重复主键\n",
" insert_query = f\"REPLACE INTO {table_name} ({columns}) VALUES ({placeholders})\"\n",
" # # 使用 INSERT INTO 处理重复主键(忽略冲突)\n",
" # insert_query = f\"INSERT IGNORE INTO {table_name} ({columns}) VALUES ({placeholders})\"\n",
"\n",
" # 批量插入数据\n",
" cursor.executemany(insert_query, records)\n",
" \n",
" # 提交事务\n",
" connection.commit()\n",
" print(f\"成功导入 {len(df)} 条记录到表 {table_name}\")\n",
" \n",
" except Error as e:\n",
" print(f\"导入数据到MySQL出错: {e}\")\n",
" finally:\n",
" if 'cursor' in locals():\n",
" cursor.close()\n",
" if 'connection' in locals() and connection.is_connected():\n",
" connection.close()\n",
"\n",
"print(\"程序执行完毕\")"
],
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"已清空表 sms_verification_result_bi_V5 数据\n"
]
},
{
"ename": "KeyboardInterrupt",
"evalue": "",
"output_type": "error",
"traceback": [
"\u001B[1;31m---------------------------------------------------------------------------\u001B[0m",
"\u001B[1;31mKeyboardInterrupt\u001B[0m Traceback (most recent call last)",
"Cell \u001B[1;32mIn[10], line 41\u001B[0m\n\u001B[0;32m 36\u001B[0m insert_query \u001B[38;5;241m=\u001B[39m \u001B[38;5;124mf\u001B[39m\u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mREPLACE INTO \u001B[39m\u001B[38;5;132;01m{\u001B[39;00mtable_name\u001B[38;5;132;01m}\u001B[39;00m\u001B[38;5;124m (\u001B[39m\u001B[38;5;132;01m{\u001B[39;00mcolumns\u001B[38;5;132;01m}\u001B[39;00m\u001B[38;5;124m) VALUES (\u001B[39m\u001B[38;5;132;01m{\u001B[39;00mplaceholders\u001B[38;5;132;01m}\u001B[39;00m\u001B[38;5;124m)\u001B[39m\u001B[38;5;124m\"\u001B[39m\n\u001B[0;32m 37\u001B[0m \u001B[38;5;66;03m# # 使用 INSERT INTO 处理重复主键(忽略冲突)\u001B[39;00m\n\u001B[0;32m 38\u001B[0m \u001B[38;5;66;03m# insert_query = f\"INSERT IGNORE INTO {table_name} ({columns}) VALUES ({placeholders})\"\u001B[39;00m\n\u001B[0;32m 39\u001B[0m \n\u001B[0;32m 40\u001B[0m \u001B[38;5;66;03m# 批量插入数据\u001B[39;00m\n\u001B[1;32m---> 41\u001B[0m cursor\u001B[38;5;241m.\u001B[39mexecutemany(insert_query, records)\n\u001B[0;32m 43\u001B[0m \u001B[38;5;66;03m# 提交事务\u001B[39;00m\n\u001B[0;32m 44\u001B[0m connection\u001B[38;5;241m.\u001B[39mcommit()\n",
"File \u001B[1;32mD:\\ProgramTools\\Anaconda\\Lib\\site-packages\\mysql\\connector\\cursor_cext.py:486\u001B[0m, in \u001B[0;36mCMySQLCursor.executemany\u001B[1;34m(self, operation, seq_params)\u001B[0m\n\u001B[0;32m 479\u001B[0m \u001B[38;5;28;01mtry\u001B[39;00m:\n\u001B[0;32m 480\u001B[0m \u001B[38;5;66;03m# When processing read ops (e.g., SELECT), rowcnt is updated\u001B[39;00m\n\u001B[0;32m 481\u001B[0m \u001B[38;5;66;03m# based on self._rowcount. For write ops (e.g., INSERT) is\u001B[39;00m\n\u001B[0;32m 482\u001B[0m \u001B[38;5;66;03m# updated based on self._affected_rows.\u001B[39;00m\n\u001B[0;32m 483\u001B[0m \u001B[38;5;66;03m# The variable self._description is None for write ops, that's\u001B[39;00m\n\u001B[0;32m 484\u001B[0m \u001B[38;5;66;03m# why we use it as indicator for updating rowcnt.\u001B[39;00m\n\u001B[0;32m 485\u001B[0m \u001B[38;5;28;01mfor\u001B[39;00m params \u001B[38;5;129;01min\u001B[39;00m seq_params:\n\u001B[1;32m--> 486\u001B[0m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39mexecute(operation, params)\n\u001B[0;32m 487\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39mwith_rows \u001B[38;5;129;01mand\u001B[39;00m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39m_connection\u001B[38;5;241m.\u001B[39munread_result:\n\u001B[0;32m 488\u001B[0m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39mfetchall()\n",
"File \u001B[1;32mD:\\ProgramTools\\Anaconda\\Lib\\site-packages\\mysql\\connector\\cursor_cext.py:356\u001B[0m, in \u001B[0;36mCMySQLCursor.execute\u001B[1;34m(self, operation, params, map_results)\u001B[0m\n\u001B[0;32m 348\u001B[0m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39m_executed \u001B[38;5;241m=\u001B[39m (\n\u001B[0;32m 349\u001B[0m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39m_stmt_partition[\u001B[38;5;124m\"\u001B[39m\u001B[38;5;124msingle_stmts\u001B[39m\u001B[38;5;124m\"\u001B[39m]\u001B[38;5;241m.\u001B[39mpopleft()\n\u001B[0;32m 350\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m map_results\n\u001B[0;32m 351\u001B[0m \u001B[38;5;28;01melse\u001B[39;00m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39m_stmt_partition[\u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mmappable_stmt\u001B[39m\u001B[38;5;124m\"\u001B[39m]\n\u001B[0;32m 352\u001B[0m )\n\u001B[0;32m 354\u001B[0m \u001B[38;5;28;01mtry\u001B[39;00m:\n\u001B[0;32m 355\u001B[0m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39m_handle_result(\n\u001B[1;32m--> 356\u001B[0m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39m_connection\u001B[38;5;241m.\u001B[39mcmd_query(\n\u001B[0;32m 357\u001B[0m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39m_stmt_partition[\u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mmappable_stmt\u001B[39m\u001B[38;5;124m\"\u001B[39m],\n\u001B[0;32m 358\u001B[0m raw\u001B[38;5;241m=\u001B[39m\u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39m_raw,\n\u001B[0;32m 359\u001B[0m buffered\u001B[38;5;241m=\u001B[39m\u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39m_buffered,\n\u001B[0;32m 360\u001B[0m raw_as_string\u001B[38;5;241m=\u001B[39m\u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39m_raw_as_string,\n\u001B[0;32m 361\u001B[0m )\n\u001B[0;32m 362\u001B[0m )\n\u001B[0;32m 363\u001B[0m \u001B[38;5;28;01mexcept\u001B[39;00m MySQLInterfaceError \u001B[38;5;28;01mas\u001B[39;00m err:\n\u001B[0;32m 364\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m \u001B[38;5;28mhasattr\u001B[39m(err, \u001B[38;5;124m\"\u001B[39m\u001B[38;5;124merrno\u001B[39m\u001B[38;5;124m\"\u001B[39m):\n",
"File \u001B[1;32mD:\\ProgramTools\\Anaconda\\Lib\\site-packages\\mysql\\connector\\opentelemetry\\context_propagation.py:97\u001B[0m, in \u001B[0;36mwith_context_propagation.<locals>.wrapper\u001B[1;34m(cnx, *args, **kwargs)\u001B[0m\n\u001B[0;32m 95\u001B[0m \u001B[38;5;66;03m# pylint: disable=possibly-used-before-assignment\u001B[39;00m\n\u001B[0;32m 96\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m \u001B[38;5;129;01mnot\u001B[39;00m OTEL_ENABLED \u001B[38;5;129;01mor\u001B[39;00m \u001B[38;5;129;01mnot\u001B[39;00m cnx\u001B[38;5;241m.\u001B[39motel_context_propagation:\n\u001B[1;32m---> 97\u001B[0m \u001B[38;5;28;01mreturn\u001B[39;00m method(cnx, \u001B[38;5;241m*\u001B[39margs, \u001B[38;5;241m*\u001B[39m\u001B[38;5;241m*\u001B[39mkwargs)\n\u001B[0;32m 99\u001B[0m current_span \u001B[38;5;241m=\u001B[39m trace\u001B[38;5;241m.\u001B[39mget_current_span()\n\u001B[0;32m 100\u001B[0m tp_header \u001B[38;5;241m=\u001B[39m \u001B[38;5;28;01mNone\u001B[39;00m\n",
"File \u001B[1;32mD:\\ProgramTools\\Anaconda\\Lib\\site-packages\\mysql\\connector\\connection_cext.py:772\u001B[0m, in \u001B[0;36mCMySQLConnection.cmd_query\u001B[1;34m(self, query, raw, buffered, raw_as_string, **kwargs)\u001B[0m\n\u001B[0;32m 769\u001B[0m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39m_query \u001B[38;5;241m=\u001B[39m query\n\u001B[0;32m 770\u001B[0m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39m_local_infile_filenames \u001B[38;5;241m=\u001B[39m \u001B[38;5;28;01mNone\u001B[39;00m\n\u001B[1;32m--> 772\u001B[0m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39m_cmysql\u001B[38;5;241m.\u001B[39mquery(\n\u001B[0;32m 773\u001B[0m query,\n\u001B[0;32m 774\u001B[0m raw\u001B[38;5;241m=\u001B[39mraw,\n\u001B[0;32m 775\u001B[0m buffered\u001B[38;5;241m=\u001B[39mbuffered,\n\u001B[0;32m 776\u001B[0m raw_as_string\u001B[38;5;241m=\u001B[39mraw_as_string,\n\u001B[0;32m 777\u001B[0m query_attrs\u001B[38;5;241m=\u001B[39m\u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39mquery_attrs,\n\u001B[0;32m 778\u001B[0m )\n\u001B[0;32m 779\u001B[0m \u001B[38;5;28;01mexcept\u001B[39;00m MySQLInterfaceError \u001B[38;5;28;01mas\u001B[39;00m err:\n\u001B[0;32m 780\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m \u001B[38;5;28mhasattr\u001B[39m(err, \u001B[38;5;124m\"\u001B[39m\u001B[38;5;124merrno\u001B[39m\u001B[38;5;124m\"\u001B[39m):\n",
"\u001B[1;31mKeyboardInterrupt\u001B[0m: "
]
}
],
"execution_count": 10
},
{
"cell_type": "code",
"id": "b5e1815e",
"metadata": {
"ExecuteTime": {
"end_time": "2025-06-26T07:59:04.370010Z",
"start_time": "2025-06-26T07:59:04.108084Z"
}
},
"source": [
"connection = mysql.connector.connect(\n",
" host=host,\n",
" user=user,\n",
" password=password,\n",
" database=database\n",
")\n",
"cursor = connection.cursor()\n",
"\n",
"# 清空表数据\n",
"clear_table_query = f\"TRUNCATE TABLE {table_name};\"\n",
"cursor.execute(clear_table_query)\n",
"print(f\"已清空表 {table_name} 数据\")\n",
"\n",
"# 处理数据(NaN转None\n",
"def process_value(value):\n",
" if pd.isna(value):\n",
" return None\n",
" return value\n",
" \n",
"# 逐行处理数据,确保所有NaN都被替换为None\n",
"records = []\n",
"for row in df.values:\n",
" processed_row = [process_value(value) for value in row]\n",
" records.append(tuple(processed_row))\n",
"\n",
"# 生成插入语句\n",
"columns = ', '.join(df.columns)\n",
"placeholders = ', '.join(['%s'] * len(df.columns))\n",
"\n",
"# 使用 REPLACE INTO 处理重复主键\n",
"insert_query = f\"REPLACE INTO {table_name} ({columns}) VALUES ({placeholders})\"\n",
"# # 使用 INSERT INTO 处理重复主键(忽略冲突)\n",
"# insert_query = f\"INSERT IGNORE INTO {table_name} ({columns}) VALUES ({placeholders})\"\n",
"\n",
"print(insert_query)"
],
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"已清空表 sms_verification_result_bi_V5 数据\n",
"REPLACE INTO sms_verification_result_bi_V5 (申请来源, 操作日期字符串, 审核信息, 资质名称, 签署来源, 签署代码, 资质编号, 订单编号, 签署名称, 备注, 编号, 创建时间字符串, 是否默认签署, 审核备注信息, 订单数量, 审核状态, 扩展信息, 签署类型, 是否可注册, 签署场景详情列表。签署场景详情, 文件ID列表。文件ID, 文件URL列表。文件URL, 场景类型, 服务类型, 注册结果, 资质状态, 电信注册状态, 移动注册状态, 联通注册状态, 聚合注册状态, 资质工单编号, 授权, 启用授权书, 组织机构代码, 资质版本, 授权书, 授权书审核通过, 授权书编号, 授权签署范围, 授权书名称, 授权生效时间, 委托授权, 授权书状态, 结果原因, 创建时间, 更新时间) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)\n"
]
}
],
"execution_count": 16
},
{
"cell_type": "code",
"id": "ba5257b5",
"metadata": {
"ExecuteTime": {
"end_time": "2025-06-26T08:01:47.024495Z",
"start_time": "2025-06-26T07:59:06.194489Z"
}
},
"source": [
"\n",
"# 批量插入数据\n",
"cursor.executemany(insert_query, records)\n",
"\n",
"# 提交事务\n",
"connection.commit()\n",
"print(f\"成功导入 {len(df)} 条记录到表 {table_name}\")\n",
"\n",
"\n",
"cursor.close()"
],
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"成功导入 10004 条记录到表 sms_verification_result_bi_V5\n"
]
},
{
"data": {
"text/plain": [
"True"
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"execution_count": 17
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2025-06-26T07:50:23.078149Z",
"start_time": "2025-06-26T07:50:23.072170Z"
}
},
"cell_type": "code",
"source": [
"\n",
"cursor.close()"
],
"id": "ea0040570b0dd6ac",
"outputs": [
{
"data": {
"text/plain": [
"False"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"execution_count": 15
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2025-06-26T07:39:13.676264Z",
"start_time": "2025-06-26T07:39:13.556203Z"
}
},
"cell_type": "code",
"source": [
"import mysql.connector\n",
"\n",
"# 数据库连接信息\n",
"host = \"rm-uf6r230vbtxf5gdz63o.mysql.rds.aliyuncs.com\"\n",
"user = \"rw_operation_data_relay\"\n",
"password = \"m+q5Z4%IVuF9bf\"\n",
"database = \"f6operation_data_relay\"\n",
"table_name = \"sms_verification_result_bi_V2\"\n",
"\n",
"try:\n",
" # 建立数据库连接\n",
" connection = mysql.connector.connect(\n",
" host=host,\n",
" user=user,\n",
" password=password,\n",
" database=database\n",
" )\n",
"\n",
" if connection.is_connected():\n",
" cursor = connection.cursor()\n",
"\n",
" # 查询表结构\n",
" cursor.execute(f\"DESCRIBE {table_name}\")\n",
"\n",
" # 获取所有字段信息\n",
" table_structure = cursor.fetchall()\n",
"\n",
" # 打印表结构\n",
" print(f\"表 {table_name} 的结构:\")\n",
" for column in table_structure:\n",
" print(column)\n",
"\n",
"except mysql.connector.Error as err:\n",
" print(f\"数据库错误: {err}\")\n",
"\n",
"finally:\n",
" # 关闭连接\n",
" if 'connection' in locals() and connection.is_connected():\n",
" cursor.close()\n",
" connection.close()\n",
" print(\"数据库连接已关闭。\")"
],
"id": "285c0e88a88b9277",
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"表 sms_verification_result_bi_V2 的结构:\n",
"('主键', 'int(11)', 'NO', 'PRI', None, '')\n",
"('编号', 'varchar(255)', 'YES', '', None, '')\n",
"('申请来源', 'varchar(255)', 'YES', '', None, '')\n",
"('操作日期字符串', 'varchar(255)', 'YES', '', None, '')\n",
"('审核信息', 'varchar(255)', 'YES', '', None, '')\n",
"('资质名称', 'varchar(255)', 'YES', '', None, '')\n",
"('签署来源', 'varchar(255)', 'YES', '', None, '')\n",
"('签署代码', 'varchar(255)', 'YES', '', None, '')\n",
"('资质编号', 'varchar(255)', 'YES', '', None, '')\n",
"('订单编号', 'varchar(255)', 'YES', '', None, '')\n",
"('签署名称', 'varchar(255)', 'YES', '', None, '')\n",
"('备注', 'varchar(255)', 'YES', '', None, '')\n",
"('创建时间字符串', 'varchar(255)', 'YES', '', None, '')\n",
"('是否默认签署', 'tinyint(1)', 'YES', '', None, '')\n",
"('审核备注信息', 'varchar(255)', 'YES', '', None, '')\n",
"('订单数量', 'varchar(255)', 'YES', '', None, '')\n",
"('审核状态', 'varchar(255)', 'YES', '', None, '')\n",
"('扩展信息', 'varchar(255)', 'YES', '', None, '')\n",
"('签署类型', 'varchar(255)', 'YES', '', None, '')\n",
"('是否可注册', 'varchar(255)', 'YES', '', None, '')\n",
"('签署场景详情列表。签署场景详情', 'varchar(255)', 'YES', '', None, '')\n",
"('文件ID列表。文件ID', 'varchar(255)', 'YES', '', None, '')\n",
"('文件URL列表。文件URL', 'varchar(255)', 'YES', '', None, '')\n",
"('场景类型', 'varchar(255)', 'YES', '', None, '')\n",
"('服务类型', 'varchar(255)', 'YES', '', None, '')\n",
"('注册结果', 'varchar(255)', 'YES', '', None, '')\n",
"('资质状态', 'varchar(255)', 'YES', '', None, '')\n",
"('电信注册状态', 'varchar(255)', 'YES', '', None, '')\n",
"('移动注册状态', 'varchar(255)', 'YES', '', None, '')\n",
"('联通注册状态', 'varchar(255)', 'YES', '', None, '')\n",
"('聚合注册状态', 'varchar(255)', 'YES', '', None, '')\n",
"('资质工单编号', 'varchar(255)', 'YES', '', None, '')\n",
"('授权', 'varchar(255)', 'YES', '', None, '')\n",
"('启用授权书', 'varchar(255)', 'YES', '', None, '')\n",
"('组织机构代码', 'varchar(255)', 'YES', '', None, '')\n",
"('资质版本', 'varchar(255)', 'YES', '', None, '')\n",
"('授权书', 'varchar(255)', 'YES', '', None, '')\n",
"('授权书审核通过', 'varchar(255)', 'YES', '', None, '')\n",
"('授权书编号', 'varchar(255)', 'YES', '', None, '')\n",
"('授权签署范围', 'varchar(255)', 'YES', '', None, '')\n",
"('授权书名称', 'varchar(255)', 'YES', '', None, '')\n",
"('授权生效时间', 'varchar(255)', 'YES', '', None, '')\n",
"('委托授权', 'varchar(255)', 'YES', '', None, '')\n",
"('授权书状态', 'varchar(255)', 'YES', '', None, '')\n",
"('结果原因', 'varchar(255)', 'YES', '', None, '')\n",
"数据库连接已关闭。\n"
]
}
],
"execution_count": 8
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2025-06-26T07:43:48.263735Z",
"start_time": "2025-06-26T07:43:48.091354Z"
}
},
"cell_type": "code",
"source": [
"import mysql.connector\n",
"from mysql.connector import Error\n",
"\n",
"def create_sms_verification_table_v5():\n",
" \"\"\"创建短信验证结果表 sms_verification_result_bi_V5\"\"\"\n",
" print(\"开始创建表 sms_verification_result_bi_V5...\")\n",
"\n",
" # 数据库连接配置(请根据实际情况修改)\n",
" config = {\n",
" \"host\": \"rm-uf6r230vbtxf5gdz63o.mysql.rds.aliyuncs.com\",\n",
" \"user\": \"rw_operation_data_relay\",\n",
" \"password\": \"m+q5Z4%IVuF9bf\",\n",
" \"database\": \"f6operation_data_relay\"\n",
" }\n",
"\n",
" # 表结构定义(整合V2表和CSV文件的所有字段,优化数据类型)\n",
" table_ddl = \"\"\"\n",
" CREATE TABLE IF NOT EXISTS sms_verification_result_bi_V5 (\n",
" `主键` INT(11) NOT NULL AUTO_INCREMENT COMMENT '自增主键',\n",
" `编号` VARCHAR(255) DEFAULT NULL COMMENT '签名的系统编号',\n",
" `申请来源` VARCHAR(255) DEFAULT NULL COMMENT '短信签名的申请来源',\n",
" `操作日期字符串` VARCHAR(100) DEFAULT NULL COMMENT '操作日期的字符串表示',\n",
" `审核信息` TEXT COMMENT '审核相关详细信息',\n",
" `资质名称` VARCHAR(255) DEFAULT NULL COMMENT '关联资质的名称',\n",
" `签署来源` VARCHAR(255) DEFAULT NULL COMMENT '签名的来源类型',\n",
" `签署代码` VARCHAR(255) DEFAULT NULL COMMENT '签名的唯一代码标识',\n",
" `资质编号` VARCHAR(255) DEFAULT NULL COMMENT '资质的唯一编号',\n",
" `订单编号` VARCHAR(255) DEFAULT NULL COMMENT '关联订单的编号',\n",
" `签署名称` VARCHAR(255) DEFAULT NULL COMMENT '签名的显示名称',\n",
" `备注` TEXT COMMENT '附加备注信息',\n",
" `创建时间字符串` VARCHAR(100) DEFAULT NULL COMMENT '创建时间的字符串格式',\n",
" `是否默认签署` TINYINT(1) DEFAULT NULL COMMENT '是否为默认签名(1是/0否)',\n",
" `审核备注信息` TEXT COMMENT '审核过程中的备注说明',\n",
" `订单数量` INT(11) DEFAULT NULL COMMENT '关联订单的数量',\n",
" `审核状态` VARCHAR(50) DEFAULT NULL COMMENT '当前审核状态',\n",
" `扩展信息` TEXT COMMENT '额外扩展字段',\n",
" `签署类型` VARCHAR(50) DEFAULT NULL COMMENT '签名的类型分类',\n",
" `是否可注册` TINYINT(1) DEFAULT NULL COMMENT '是否允许注册(1是/0否)',\n",
" `签署场景详情列表。签署场景详情` TEXT COMMENT '签署场景详情的JSON列表',\n",
" `文件ID列表。文件ID` TEXT COMMENT '文件ID的JSON列表',\n",
" `文件URL列表。文件URL` TEXT COMMENT '文件URL的JSON列表',\n",
" `场景类型` VARCHAR(50) DEFAULT NULL COMMENT '业务场景的类型',\n",
" `服务类型` VARCHAR(50) DEFAULT NULL COMMENT '服务的类型分类',\n",
" `注册结果` VARCHAR(50) DEFAULT NULL COMMENT '注册操作的结果',\n",
" `资质状态` VARCHAR(50) DEFAULT NULL COMMENT '资质的当前状态',\n",
" `电信注册状态` VARCHAR(50) DEFAULT NULL COMMENT '电信渠道注册状态',\n",
" `移动注册状态` VARCHAR(50) DEFAULT NULL COMMENT '移动渠道注册状态',\n",
" `联通注册状态` VARCHAR(50) DEFAULT NULL COMMENT '联通渠道注册状态',\n",
" `聚合注册状态` VARCHAR(50) DEFAULT NULL COMMENT '聚合渠道注册状态',\n",
" `资质工单编号` VARCHAR(255) DEFAULT NULL COMMENT '资质工单的唯一编号',\n",
" `授权` TEXT COMMENT '授权信息的JSON结构',\n",
" `启用授权书` TINYINT(1) DEFAULT NULL COMMENT '是否启用授权书(1是/0否)',\n",
" `组织机构代码` VARCHAR(50) DEFAULT NULL COMMENT '组织机构的代码',\n",
" `资质版本` VARCHAR(50) DEFAULT NULL COMMENT '资质的版本号',\n",
" `授权书` TEXT COMMENT '授权书内容的JSON结构',\n",
" `授权书审核通过` TINYINT(1) DEFAULT NULL COMMENT '授权书是否审核通过(1是/0否)',\n",
" `授权书编号` VARCHAR(255) DEFAULT NULL COMMENT '授权书的唯一编号',\n",
" `授权签署范围` TEXT COMMENT '授权签署范围的JSON结构',\n",
" `授权书名称` VARCHAR(255) DEFAULT NULL COMMENT '授权书的显示名称',\n",
" `授权生效时间` DATETIME DEFAULT NULL COMMENT '授权生效的具体时间',\n",
" `委托授权` TEXT COMMENT '委托授权信息的JSON结构',\n",
" `授权书状态` VARCHAR(50) DEFAULT NULL COMMENT '授权书的当前状态',\n",
" `结果原因` TEXT COMMENT '操作结果的原因说明',\n",
" `创建时间` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '记录创建时间',\n",
" `更新时间` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '记录更新时间',\n",
" PRIMARY KEY (`主键`),\n",
" KEY `idx_签署名称` (`签署名称`),\n",
" KEY `idx_审核状态` (`审核状态`),\n",
" KEY `idx_创建时间` (`创建时间`),\n",
" KEY `idx_资质编号` (`资质编号`),\n",
" KEY `idx_订单编号` (`订单编号`)\n",
" ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='短信验证结果BI表V5(整合V2和CSV所有字段)'\n",
" \"\"\"\n",
"\n",
" try:\n",
" # 建立数据库连接\n",
" connection = mysql.connector.connect(**config)\n",
" cursor = connection.cursor()\n",
"\n",
" # 执行建表语句\n",
" cursor.execute(table_ddl)\n",
" connection.commit()\n",
" print(\"表 sms_verification_result_bi_V5 创建成功!\")\n",
"\n",
" # 验证表结构\n",
" cursor.execute(\"DESCRIBE sms_verification_result_bi_V5\")\n",
" columns = cursor.fetchall()\n",
" print(\"\\n表结构详情:\")\n",
" for col in columns:\n",
" print(f\"字段名: {col[0]}, 类型: {col[1]}, 注释: {col[4] if col[4] else '无注释'}\")\n",
"\n",
" except Error as e:\n",
" print(f\"建表失败,错误信息: {e}\")\n",
" finally:\n",
" # 释放资源\n",
" if 'cursor' in locals() and cursor:\n",
" cursor.close()\n",
" if 'connection' in locals() and connection.is_connected():\n",
" connection.close()\n",
" print(\"表创建操作完成\")\n",
"\n",
"if __name__ == \"__main__\":\n",
" create_sms_verification_table_v5()"
],
"id": "afea3b844a28b237",
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"开始创建表 sms_verification_result_bi_V5...\n",
"表 sms_verification_result_bi_V5 创建成功!\n",
"\n",
"表结构详情:\n",
"字段名: 主键, 类型: int(11), 注释: 无注释\n",
"字段名: 编号, 类型: varchar(255), 注释: 无注释\n",
"字段名: 申请来源, 类型: varchar(255), 注释: 无注释\n",
"字段名: 操作日期字符串, 类型: varchar(100), 注释: 无注释\n",
"字段名: 审核信息, 类型: text, 注释: 无注释\n",
"字段名: 资质名称, 类型: varchar(255), 注释: 无注释\n",
"字段名: 签署来源, 类型: varchar(255), 注释: 无注释\n",
"字段名: 签署代码, 类型: varchar(255), 注释: 无注释\n",
"字段名: 资质编号, 类型: varchar(255), 注释: 无注释\n",
"字段名: 订单编号, 类型: varchar(255), 注释: 无注释\n",
"字段名: 签署名称, 类型: varchar(255), 注释: 无注释\n",
"字段名: 备注, 类型: text, 注释: 无注释\n",
"字段名: 创建时间字符串, 类型: varchar(100), 注释: 无注释\n",
"字段名: 是否默认签署, 类型: tinyint(1), 注释: 无注释\n",
"字段名: 审核备注信息, 类型: text, 注释: 无注释\n",
"字段名: 订单数量, 类型: int(11), 注释: 无注释\n",
"字段名: 审核状态, 类型: varchar(50), 注释: 无注释\n",
"字段名: 扩展信息, 类型: text, 注释: 无注释\n",
"字段名: 签署类型, 类型: varchar(50), 注释: 无注释\n",
"字段名: 是否可注册, 类型: tinyint(1), 注释: 无注释\n",
"字段名: 签署场景详情列表。签署场景详情, 类型: text, 注释: 无注释\n",
"字段名: 文件ID列表。文件ID, 类型: text, 注释: 无注释\n",
"字段名: 文件URL列表。文件URL, 类型: text, 注释: 无注释\n",
"字段名: 场景类型, 类型: varchar(50), 注释: 无注释\n",
"字段名: 服务类型, 类型: varchar(50), 注释: 无注释\n",
"字段名: 注册结果, 类型: varchar(50), 注释: 无注释\n",
"字段名: 资质状态, 类型: varchar(50), 注释: 无注释\n",
"字段名: 电信注册状态, 类型: varchar(50), 注释: 无注释\n",
"字段名: 移动注册状态, 类型: varchar(50), 注释: 无注释\n",
"字段名: 联通注册状态, 类型: varchar(50), 注释: 无注释\n",
"字段名: 聚合注册状态, 类型: varchar(50), 注释: 无注释\n",
"字段名: 资质工单编号, 类型: varchar(255), 注释: 无注释\n",
"字段名: 授权, 类型: text, 注释: 无注释\n",
"字段名: 启用授权书, 类型: tinyint(1), 注释: 无注释\n",
"字段名: 组织机构代码, 类型: varchar(50), 注释: 无注释\n",
"字段名: 资质版本, 类型: varchar(50), 注释: 无注释\n",
"字段名: 授权书, 类型: text, 注释: 无注释\n",
"字段名: 授权书审核通过, 类型: tinyint(1), 注释: 无注释\n",
"字段名: 授权书编号, 类型: varchar(255), 注释: 无注释\n",
"字段名: 授权签署范围, 类型: text, 注释: 无注释\n",
"字段名: 授权书名称, 类型: varchar(255), 注释: 无注释\n",
"字段名: 授权生效时间, 类型: datetime, 注释: 无注释\n",
"字段名: 委托授权, 类型: text, 注释: 无注释\n",
"字段名: 授权书状态, 类型: varchar(50), 注释: 无注释\n",
"字段名: 结果原因, 类型: text, 注释: 无注释\n",
"字段名: 创建时间, 类型: datetime, 注释: CURRENT_TIMESTAMP\n",
"字段名: 更新时间, 类型: datetime, 注释: CURRENT_TIMESTAMP\n",
"表创建操作完成\n"
]
}
],
"execution_count": 9
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.13.3"
}
},
"nbformat": 4,
"nbformat_minor": 5
}