侧边栏壁纸
博主头像
YOUZI

我依旧在追寻自由的路上

  • 累计撰写 85 篇文章
  • 累计创建 10 个分类
  • 累计创建 27 个标签

目 录CONTENT

文章目录

删除数据库指定行

柚子
原创 / 2024-08-09 / 0 评论 / 0 点赞 / 43 阅读 / 0 字
温馨提示:
部分素材来自网络,若不小心影响您的利益,请联系 站长 删除。

背景

在使用umami做流量统计时发现在来源域名会出现服务器IP地址,这是因为有时候我会使用IP访问来测试。但我不想出现我服务器的真实IP,于是我想到umami使用的是数据库,删除相应数据就应该OK。

代码

python

需要有python环境,需要安装可参考这里;需要mysql-connector-python

python3.10 -m pip install mysql-connector-python
import re
import mysql.connector

# MySQL数据库连接配置
db_config = {
    'host': '127.0.0.1',
    'user': 'umami_name',
    'password': 'umami_password',
    'database': 'umami_database',
    'port': 3306,
    'charset': 'utf8mb4'
}

# 连接到数据库
conn = mysql.connector.connect(**db_config)
cursor = conn.cursor()

# 指定表名和字段名
table_name = 'website_event'
field_name = 'referrer_domain'
primary_key_column = 'event_id'

# 匹配IP地址的正则表达式
ip_pattern = r'\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b'

# 查询包含IP地址的记录
query = f"SELECT {primary_key_column}, {field_name} FROM {table_name}"
cursor.execute(query)

# 遍历查询结果,删除包含IP地址的行
records_to_delete = []
for record_id, field_value in cursor.fetchall():
    if re.search(ip_pattern, field_value):
        records_to_delete.append(record_id)
        print(f"标记为删除: {primary_key_column} {record_id} 的记录。")

# 批量删除记录
if records_to_delete:
    delete_query = f"DELETE FROM {table_name} WHERE {primary_key_column} IN ({','.join(['%s'] * len(records_to_delete))})"
    cursor.execute(delete_query, tuple(records_to_delete))
    print(f"已删除 {len(records_to_delete)} 条包含 IP 地址的记录。")
else:
    print("没有找到包含 IP 地址的记录。")

# 提交更改并关闭连接
conn.commit()
cursor.close()
conn.close()

更新

[2024/08/30]

可添加新表,新的删除条件。

import re
import mysql.connector

# MySQL数据库连接配置
db_config = {
    'host': '127.0.0.1',
    'user': 'umami_name',
    'password': 'umami_password',
    'database': 'umami_database',
    'port': 3306,
    'charset': 'utf8mb4'
}

# 连接到数据库
conn = mysql.connector.connect(**db_config)
cursor = conn.cursor()

# 多个表、字段和主键的配置
tables_config = [
    {'table_name': 'website_event', 'field_name': 'referrer_domain', 'primary_key_column': 'event_id'},
    # 可以添加更多的表配置
]

# 匹配IP地址的正则表达式
ip_pattern = r'\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b'

# 指定要删除的域名
specified_domain = "example.com"

# 遍历每个表配置
for config in tables_config:
    table_name = config['table_name']
    field_name = config['field_name']
    primary_key_column = config['primary_key_column']

    # 查询包含IP地址或指定域名的记录
    query = f"SELECT {primary_key_column}, {field_name} FROM {table_name}"
    cursor.execute(query)

    # 遍历查询结果,删除包含IP地址或指定域名的行
    records_to_delete = []
    for record_id, field_value in cursor.fetchall():
        if re.search(ip_pattern, field_value) or specified_domain in field_value:
            records_to_delete.append(record_id)
            print(f"标记为删除: {primary_key_column} {record_id} 的记录 (表 {table_name}),原因:包含IP或指定域名。")

    # 批量删除记录
    if records_to_delete:
        delete_query = f"DELETE FROM {table_name} WHERE {primary_key_column} IN ({','.join(['%s'] * len(records_to_delete))})"
        cursor.execute(delete_query, tuple(records_to_delete))
        print(f"已删除 {len(records_to_delete)} 条记录 (表 {table_name}),原因:包含IP或指定域名。")
    else:
        print(f"没有找到包含IP或指定域名的记录 (表 {table_name})。")

# 提交更改并关闭连接
conn.commit()
cursor.close()
conn.close()

shell

需要有MySQL环境,需要安装可参考使用下面的命名快捷安装。

sudo yum -y install mysql
#!/bin/bash

# MySQL数据库连接配置
HOST='127.0.0.1'
USER='umami_name'
PASSWORD='umami_password'
DATABASE='umami_database'
# shellcheck disable=SC2034
PORT=3306

# 指定表名和字段名
TABLE_NAME='website_event'
FIELD_NAME='referrer_domain'
PRIMARY_KEY_COLUMN='event_id'

# 匹配IP地址的正则表达式
IP_PATTERN='([0-9]{1,3}\.){3}[0-9]{1,3}'

# 查询包含IP地址的记录
QUERY="SELECT ${PRIMARY_KEY_COLUMN}, ${FIELD_NAME} FROM ${TABLE_NAME};"

# 连接到数据库并执行查询
RESULT=$(mysql -h "$HOST" -u "$USER" -p"$PASSWORD" -D "$DATABASE" -e "$QUERY" | tail -n +2)

# 初始化删除列表
RECORDS_TO_DELETE=()

# 遍历查询结果,找到包含IP地址的行
while IFS=$'\t' read -r RECORD_ID FIELD_VALUE; do
    if [[ $FIELD_VALUE =~ $IP_PATTERN ]]; then
        RECORDS_TO_DELETE+=("\"$RECORD_ID\"")
        echo "标记为删除: ${PRIMARY_KEY_COLUMN} $RECORD_ID 的记录。"
    fi
done <<< "$RESULT"

# 批量删除记录
if [ ${#RECORDS_TO_DELETE[@]} -gt 0 ]; then
    DELETE_IDS=$(IFS=','; echo "${RECORDS_TO_DELETE[*]}")
    DELETE_QUERY="DELETE FROM ${TABLE_NAME} WHERE ${PRIMARY_KEY_COLUMN} IN ($DELETE_IDS);"
    mysql -h "$HOST" -u "$USER" -p"$PASSWORD" -D "$DATABASE" -e "$DELETE_QUERY"
    echo "已删除 ${#RECORDS_TO_DELETE[@]} 条包含 IP 地址的记录。"
else
    echo "没有找到包含 IP 地址的记录。"
fi

示例

这里使用cron来设置任务,嫌麻烦可以使用宝塔或者其他的定时任务功能。

确保脚本有执行权限,使用以下命令赋予权限:

chmod +x /path/to/your/script.py

编辑crontab文件

crontab -e

添加定时任务

*/30 * * * * /path/to/your/python /path/to/your/script.py
  • */30 表示每30分钟执行一次。

  • * * * * 表示每天、每月、每周的所有时间(保持默认设置)。

  • /path/to/your/python 是Python解释器的路径。如果虚拟环境中运行脚本,确保使用虚拟环境中的Python解释器路径。

  • /path/to/your/script.py 是Python脚本的完整路径。

日志检查(可选)

*/30 * * * * /path/to/your/python /path/to/your/script.py >> /path/to/your/logfile.log 2>&1

0

评论区