定时写入数据库脚本
前言
Python是一个广受欢迎的编程语言,以其简洁性和强大的库支持著称。在这篇博客中,记录Python学习经历,如何使用Python来自动化数据写入MySQL数据库。
检查并更新python
安装python
以腾讯云宝塔为例,ssh登录到服务器,检查python版本
服务器上的Python版本是2.7.5,这是一个比较旧的版本,不支持许多现代Python库和特性。通过SSH安装一个更新版本的Python。在大多数Linux发行版上,使用以下命令安装Python 3:
sudo yum install python3
安装完成后,使用以下命令来确认安装并查看版本:
python3 --version
安装所需库
使用pip3安装mysql-connector-python。在SSH终端中运行以下命令:
pip3 install mysql-connector-python
因为要使用 mysql-connector-python ,需要安装与python 3 兼容的版本:
pip3 install mysql-connector-python==8.0.25
这里8.0.25是一个示例版本号,可以需要根据实际情况选择合适的版本
编写python脚本
创建一个Python脚本,每隔一定时间向MySQL数据库写入随机生成的数据。这个任务涉及到了几个关键的Python概念,包括模块导入、函数定义、数据库操作以及异常处理。
脚本概览
这个Python脚本的主要作用是定期向MySQL数据库中写入随机生成的数据。具体来说,它执行以下操作:
1.生成随机IP地址:利用 random_ip 函数,脚本生成了随机的IP地址。这是通过创建一个随机的32位整数,然后将其转换为标准的点分十进制格式来实现的。
2.连接到MySQL数据库:脚本使用 connect_to_database 函数建立与MySQL数据库的连接。这个函数使用了 mysql.connector 库来创建一个数据库连接,这是与MySQL数据库交互的主要接口。
3.写入数据到数据库:使用 write_to_database 函数,脚本将数据写入到指定的MySQL数据库中。这个函数执行一个SQL插入(INSERT)操作,将生成的随机IP地址、设备信息、访问次数、日期和时间等信息写入数据库表中。如果在同一天内相同的IP和设备已经存在记录,则更新这条记录的访问次数和最后访问时间。
4.定期执行:脚本在 main 函数中使用一个无限循环,每次循环中都会暂停随机的时间(介于60秒到600秒之间),然后执行数据写入操作。这样,脚本会不断地在随机间隔时间内向数据库添加新的数据记录或更新现有记录。
5.异常处理和循环终止:脚本在 main 函数中用 try-except 块包裹了循环,以处理可能出现的异常。当用户手动中断脚本(比如使用Ctrl+C)时,会捕获 KeyboardInterrupt 异常,并优雅地关闭数据库连接,然后退出脚本。
6.保持持续运行:虽然脚本本身没有包含代码来保证其在后台持续运行,但它可以通过命令行工具如 nohup 配合 & 在后台持续运行,即使用户断开SSH连接后也不会停止。
数据库结构
$table = "CREATE TABLE IF NOT EXISTS visitor_count (
id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY, -- 主键,自增,用于唯一标识每条记录
ip VARCHAR(50), -- 访问者的IP地址
location VARCHAR(100), -- 访问者的地理位置
device VARCHAR(255), -- 访问者使用的设备信息
visits INT(30) NOT NULL, -- 当天该IP和设备的访问次数
date DATE NOT NULL, -- 记录的日期
total_visits INT(11) NOT NULL DEFAULT 1, -- 该IP和设备的总访问次数,默认为1
first_visit_time DATETIME NULL, -- 该IP和设备的首次访问时间
last_visit_time DATETIME NULL, -- 该IP和设备的最后访问时间
UNIQUE KEY unique_visit (ip, device, date) -- 组合键,保证同一IP和设备在同一天的记录是唯一的
)";
脚本主要实现网站访客自动化递增(对于初期建站来说是很必要的)
脚本代码:
import mysql.connector # 导入MySQL连接器模块
import time # 导入时间模块,用于处理时间相关的功能
import random # 导入随机数模块
from datetime import datetime # 从datetime模块导入datetime类,用于处理日期和时间
import socket # 导入socket模块,用于网络操作
import struct # 导入struct模块,用于处理字节流
import sys # 处理标准输入输出
def random_ip():
""" 生成随机IP地址 """
# 生成一个随机整数,然后使用inet_ntoa将其转换为点分十进制格式的IP地址
return socket.inet_ntoa(struct.pack('>I', random.randint(1, 0xffffffff)))
def connect_to_database():
""" 连接到MySQL数据库 """
# 使用mysql.connector.connect建立与MySQL数据库的连接
return mysql.connector.connect(
host="", # 数据库主机地址
user="", # 数据库用户名
password="", # 数据库密码
database="" # 要连接的数据库名称
)
def write_to_database(db_connection, ip, device, date, visits, first_visit_time, last_visit_time):
""" 向数据库写入数据 """
cursor = db_connection.cursor() # 创建一个数据库游标对象
# SQL查询语句
query = """
INSERT INTO visitor_count
(ip, location, device, visits, date, total_visits, first_visit_time, last_visit_time)
VALUES (%s, 'python', %s, %s, %s, 1, %s, %s)
ON DUPLICATE KEY UPDATE
visits = visits + 1, last_visit_time = VALUES(last_visit_time)
"""
# 执行SQL查询
cursor.execute(query, (ip, device, visits, date, first_visit_time, last_visit_time))
db_connection.commit() # 提交事务到数据库
def main():
db_connection = connect_to_database() # 连接到数据库
try:
while True: # 创建一个无限循环,持续运行
# 随机等待时间,介于60秒到600秒之间
wait_time = random.randint(60, 600)
time.sleep(wait_time) # 暂停指定的时间
current_time = datetime.now() # 获取当前时间
# 格式化日期和时间为字符串
date_str = current_time.strftime("%Y-%m-%d")
time_str = current_time.strftime("%Y-%m-%d %H:%M:%S")
ip = random_ip() # 生成随机IP地址
device = "python_script" # 设备名称
# 调用函数将数据写入数据库
write_to_database(db_connection, ip, device, date_str, 1, time_str, time_str)
# 打印信息,显示数据已写入并显示下次写入的等待时间
print(f"Data written to database at {time_str}. Next write after {wait_time} seconds.")
sys.stdout.flush()
except KeyboardInterrupt:
# 如果用户中断程序(比如使用Ctrl+C),打印信息
print("Script interrupted by user.")
finally:
# 最后关闭数据库连接
db_connection.close()
# 检查是否直接运行此脚本,而不是导入它
if __name__ == "__main__":
main() # 运行main函数
运行脚本
通过SSH转到脚本所在的目录。然后使用以下命令来运行脚本:
python3 visitor.py
成功运行并打印信息
停止脚本
1.找到进程ID(PID)
这可以通过 ps 命令查找到包含脚本名称的进程。在命令行中运行:
ps -ef | grep visitor.py
2.停止进程
使用 kill 命令来停止进程。将 PID 替换为上一步中找到的进程ID:
kill PID
例如:
脚本持续运行
希望脚本在断开SSH连接后继续运行,可以使用nohup:
nohup python3 visitor.py &
这将使脚本在后台运行,即使关闭了SSH会话也不会停止。脚本的输出将被重定向到名为nohup.out的文件中。可以使用tail来查看这个文件的内容:
tail -f nohup.out
注意事项
更新了代码后,需要重启脚本。简单地上传新版本的脚本或更新服务器代码,先停止之前脚本,并再次使用 nohup 命令启动它。如果没有停止之前运行的相同脚本的实例,那么两个(或更多)脚本的实例将同时运行。这可能会导致预期外的行为,尤其是如果脚本中涉及到写入数据库等操作时。
评论已关闭