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_time
4个字段!
理论就要进行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:主要逻辑
- 首先获取连接数据库下的所有表,进行遍历
- 再获取每个表下面的所有字段
- 在根据字段进行一一查询
- 三层循环结束,over!
总结
本次就是一个使用脚本解决实际问题的例子,我们虽然是码农,但是不一定非得搬砖!
也可以做一些有意思的事,来方便或者他人的工作或者生活。
先别着急,还有下一章,看看如何使用Go语言完成上述需求,直接打包成exe,更方便食用!
如果在操作过程中有任何问题,记得下面留言,我们看到会第一时间解决问题。
乾坤未定,你我皆是黑马。
我是码农星期八,如果觉得还不错,记得动手点赞一下哈。
感谢你的观看。