存储数据库MYSQL-行政区划代码-5级12位-最终版

# CY3761 | 2021-11-20 23:52
import os
import time

import mysql.connector.errors
from mysql.connector import connect

joinStr = '\n'
fileSep = ','
fileDataEncoding = 'utf-8'


def timePlus():
    t = time.time()
    
    return '%s %.4f' % (time.strftime('%H:%M:%S', time.localtime(t)), t - int(t))


def getFileData(filePath):
    if os.path.exists(filePath):
        with open(filePath, 'r', encoding=fileDataEncoding) as r:
            fileData = r.readlines()
            
            # 这里最好一次循环解决
            newFileData = []
            for _ in fileData:
                if _:
                    _ = _.replace(joinStr, '').split(fileSep)
                    # 这里不能去末尾0 否则 10会变成 1 比较麻烦
                    _a = _[1]  # 名称
                    _b = _[2]  # 上级代码
                    _c = _[3]  # 当前代码
                    
                    newFileData.append((_a, _b, _c))
            
            return newFileData


dataDirPath = r'I:\AIoT智能物联网工程师\AIoT智能物联网\PY基础\玩儿转PY网络爬虫\学习代码\第9站-Linux环境编程基础\行政区划代码\2020\data'

walkItem = list(os.walk(dataDirPath))

items = []
i = 0
print('数据读取..')

""""""
for (a, b, c) in walkItem:
    for _ in c:
        _ = os.path.abspath(a + '/' + _)
        d = getFileData(_)
        
        if d:
            items.extend(d)
            i += len(d)
            print('\r已读取 %s 条数据 时间: %s' % (str(i).zfill(6), timePlus()), end='')
        
        # print(k, _)
        # print('\n'.join([fileSep.join(_) for _ in d]))

# print('\n'.join([fileSep.join(_) for _ in items]))

itemsLen = len(items)
saveFile = '行政区划代码-2020'

print('\n共读取 %s 条数据' % itemsLen)  # 可以遍历进行存储数据

# 存储(四) Mysql
# 本地MYSQL服务器帐户配置
connectCfg = {
    'host': 'localhost',
    'user': 'root',
    'password': '$23~45A78%90b',
    # 'database': 'test',  # 这里只进行登录不进行选择数据库
    'auth_plugin': 'mysql_native_password',  # MYSQL 8.0 需要
    'charset': 'utf8mb4'
}


class MysqlPlus:
    # 不能在这里设置连接数据库 否则文件运行就直接报错
    def __init__(self, database, table):
        self.conn = connect(**connectCfg)  # 关键字传参(字典注解)
        self.curs = self.conn.cursor()  # 获取游标对象
        
        self.database = database
        self.table = table
        
        self.charset = connectCfg.get('charset', 'utf8mb4')
        self.collate = 'utf8mb4_0900_ai_ci'
    
    def isExistsDatabase(self):
        return bool(self.findOne("SHOW DATABASES Like %s", (self.database,)))
    
    def createDatabase(self):
        if not self.isExistsDatabase():
            sql = f"CREATE DATABASE `{self.database}` character set '{self.charset}' collate '{self.collate}'"
            return bool(self.exec(sql))
        
        self.curs.execute(f"USE {self.database}")
        return False
    
    def isExistsTable(self):
        return bool(self.findOne("SHOW TABLE STATUS LIKE '%s'" % self.table))
    
    def createTable(self, struct, comment):
        if not self.isExistsTable():
            sql = [f"create table `{self.database}`.`{self.table}` ("]
            
            for _ in struct:
                sql.append(_.strip() + ',')
            sql[-1] = sql[-1][0:-1]
            
            sql.append(
                f") ENGINE = InnoDB CHARACTER SET = 'utf8mb4' COLLATE = 'utf8mb4_0900_ai_ci' COMMENT = '{comment}'")
            
            self.exec(''.join(sql))
            
            return self.isExistsTable()
        return False
    
    def find(self, sql, params):
        self.curs.execute(sql, params)
        
        # print('statement: ', self.curs.statement)
    
    def findOne(self, sql, params=()):
        self.find(sql, params)
        
        return self.curs.fetchone()
    
    def findAll(self, sql, params=()):
        find(sql, params)
        
        return self.curs.fetchall()
    
    def exec(self, sql, params=()):
        self.curs.execute(sql, params)
        self.conn.commit()
        
        # print('statement: ', self.curs.statement)
        
        # 返回获取影响函数
        return self.curs.rowcount


""""""


def main():
    try:
        o = MysqlPlus('csdn', 'stats')
    except (Exception, BaseException) as e:
        print(e)
    else:
        # 检查数据库是否存在
        print(o.isExistsDatabase())
        # 创建数据库
        print(o.createDatabase())
        # 检查数据表是否存在
        print(o.isExistsTable())
        # 创建数据表
        print(o.createTable([
            "`code` char(12) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' UNIQUE COMMENT '当前行政区划代码'",
            "`pcode` char(12) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '父级行政区划代码'",
            "`name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '当前行政区划名称'",
            "PRIMARY KEY (`code`)"
        ], '行政区划代码-2020'))
        
        for k, _ in enumerate(items):
            k = str(k).zfill(6)
            # 321
            code = _[2]
            pcode = _[1]
            name = _[0]
            
            # print(k, code, pcode, name)
            sql = f'REPLACE INTO `{o.database}`.`{o.table}` (`code`, `pcode`, `name`) VALUE (%s,%s,%s)'
            isExec = o.exec(sql, (code, pcode, name))
            print('\r%s 执行%s 时间: %s SQL: %s' % (k, '成功' if isExec else '失败', timePlus(), o.curs.statement), end='')
            
            # break
        print('执行完成')


if __name__ == '__main__':
    main()

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CY3761

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值