Mysql根据内容查找在哪个表(python版本)

Mysql根据内容查找在哪个表(python版本)

前言

哈喽,大家好,我是星期八!

事情是这样婶的,我在一家某某某公司上班,由于另外一个系统升级,需要根据内容找在哪个表!

但是只知道内容,但是不知道内容在哪个表,所以只能只能一个一个表翻。。。

关键是,现在随便一个项目轻轻松松都十几张表起步,每张表七八个字段起步都正常!

所以,可累死我同事了!

基于上述需求,我思考来,思考去,一定要把这个功能实现咯!!!

脚本依赖包

脚本使用Python开发,可以快速完成功能,依赖如下!

PyMySQL==0.9.2

只使用了一个PyMySQL包!

脚本,可以直接拿去用

import time

import pymysql


# 功能:根据内容,遍历数据库每张表每个字段,进行查找


# 根据数据库获取当前数据库下所有表
def get_for_database_all_table(database):
    # 数据库前缀
    database_prefix = "Tables_in_"
    # 拼接数据库列
    database_key = f"{database_prefix}{database}"
    # 执行sql获取当前数据据下所有表
    sql = f"SHOW TABLES FROM {database};"
    cursor.execute(sql)
    # 获取所有表
    all_table = cursor.fetchall()
    # 转成列表
    all_table = [table.get(database_key) for table in all_table]
    return all_table


# 根据表名获取当前表所有字段
def get_for_table_all_field(table):
    # sql
    sql = f"select COLUMN_NAME from information_schema.COLUMNS where table_name = '{table}';"
    # 执行sql
    cursor.execute(sql)
    # 获取表字段
    field_list = cursor.fetchall()
    # 转成列表
    field_list = [field.get("COLUMN_NAME") for field in field_list]
    return field_list


# 根据字段一一查询,成功返回row,失败返回None
def for_field_select(table, field, content):
    sql = f'SELECT * from {table} where {field} like "%{content}%";'
    try:
        cursor.execute(sql)
        row = cursor.fetchone()
    except Exception as e:
        # print("error_sql:",sql)
        row = None
    return table, field, row


if __name__ == '__main__':
    # 数据库名
    database = "dev_xcrm"
    # 查找的内容
    content = "待"
    # 字段查询等待时间
    wait_time = 0.5

    db = pymysql.connect("127.0.0.1", "root", "rootroot", database, cursorclass=pymysql.cursors.DictCursor)
    # 使用 cursor() 方法创建一个游标对象 cursor
    cursor = db.cursor()

    # begin:主要逻辑,三层for循环
    begin_time = time.time()
    tables = get_for_database_all_table(database)
    for table in tables:
        fields = get_for_table_all_field(table)
        for field in fields:
            rtable, rfield, row = for_field_select(table, field, content)
            if not row:
                continue
            # 打印结果
            print(f"表名:{rtable},列名:{rfield}")
            time.sleep(wait_time)
    end_time = time.time()
    elapsed_time = end_time-begin_time
    print("运行时间:", elapsed_time)
    #  end:主要逻辑

    # 关闭数据库连接
    db.close()

执行结果

在这里插入图片描述

用到的相关Mysql命令

查询当前数据库下有哪些表

SQL

show TABLES;

执行结果

在这里插入图片描述

查询指定数据库下有哪些表

SQL

# 语法
SHOW TABLES FROM <数据库>;
# 示例,查询dev_xcrm有哪些表
SHOW TABLES FROM dev_xcrm;

执行结果

在这里插入图片描述

查询表里有哪些字段

SQL

# 语法
select COLUMN_NAME from information_schema.COLUMNS where table_name = <表名>;
# 示例,查询app01_carinfochoices有哪些字段
select COLUMN_NAME from information_schema.COLUMNS where table_name = 'app01_carinfochoices'; 

执行结果

在这里插入图片描述

一一匹配对每个字段进行like查询

以上述app01_carinfochoices表为例,有id,title,create_time,update_time4个字段!

理论就要进行4次查询!

假设要匹配的内容为

应该是这样婶的!

SELECT * from app01_carinfochoices where id like '%待%';
SELECT * from app01_carinfochoices where title like '%待%';
SELECT * from app01_carinfochoices where create_time like '%待%';
SELECT * from app01_carinfochoices where update_time like "%待%";

注意啊,like时间字段时,通常会报这个错!

在这里插入图片描述

所以啊,我们只需要将上述Mysql命令使用编程语言进行组合,就可以实现批量查找!

Python脚本解读

连接操作这里就不多做解释了,直接从封装的函数开始!

根据数据库获取当前数据库下所有表

def get_for_database_all_table(database):
    # 数据库前缀
    database_prefix = "Tables_in_"
    # 拼接数据库列
    database_key = f"{database_prefix}{database}"
    # 执行sql获取当前数据据下所有表
    sql = f"SHOW TABLES FROM {database};"
    cursor.execute(sql)
    # 获取所有表
    all_table = cursor.fetchall()
    # 转成列表
    all_table = [table.get(database_key) for table in all_table]
    return all_table

database_key这是因为在执行SHOW TABLES FROM dev_xcrm;或者show TABLES;时,列名是不固定的。

在这里插入图片描述

因为获取的是字典,但是还要转成列表,所以key必须要灵活获取!!

根据表名获取当前表所有字段

def get_for_table_all_field(table):
    # sql
    sql = f"select COLUMN_NAME from information_schema.COLUMNS where table_name = '{table}';"
    # 执行sql
    cursor.execute(sql)
    # 获取表字段
    field_list = cursor.fetchall()
    # 转成列表
    field_list = [field.get("COLUMN_NAME") for field in field_list]
    return field_list

这个就不用多解释咯,只需要动态传入表名即可,列名是固定的,也不需要动态构造列名key

根据字段一一查询,成功返回row,失败返回None

def for_field_select(table, field, content):
    sql = f'SELECT * from {table} where {field} like "%{content}%";'
    try:
        cursor.execute(sql)
        row = cursor.fetchone()
    except Exception as e:
        # print("error_sql:",sql)
        row = None
    return table, field, row

这个其实就很好理解了,一一查询内容是否在指定表里面即可,有就返回!

因为有的字段是不能like的,像时间字段等,所以要try错误!

主要逻辑,三层for循环

begin_time = time.time()
tables = get_for_database_all_table(database)
for table in tables:
    fields = get_for_table_all_field(table)
    for field in fields:
        rtable, rfield, row = for_field_select(table, field, content)
        if not row:
            continue
        # 打印结果
        print(f"表名:{rtable},列名:{rfield}")
        time.sleep(wait_time)
end_time = time.time()
elapsed_time = end_time-begin_time
print("运行时间:", elapsed_time)
#  end:主要逻辑
  1. 首先获取连接数据库下的所有表,进行遍历
  2. 再获取每个表下面的所有字段
  3. 在根据字段进行一一查询
  4. 三层循环结束,over!

总结

本次就是一个使用脚本解决实际问题的例子,我们虽然是码农,但是不一定非得搬砖!

也可以做一些有意思的事,来方便或者他人的工作或者生活。

先别着急,还有下一章,看看如何使用Go语言完成上述需求,直接打包成exe,更方便食用!

如果在操作过程中有任何问题,记得下面留言,我们看到会第一时间解决问题。

乾坤未定,你我皆是黑马。

我是码农星期八,如果觉得还不错,记得动手点赞一下哈。

感谢你的观看。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值