当前位置:首页 > 技术 > 正文内容

Python 与 MySQL 数据库交互及 Paramiko 远程管理详解

访客 技术 2026年6月8日 1

MySQL 数据库基础

MySQL 是一种广泛使用的关系型数据库管理系统(RDBMS),最初由瑞典 MySQL AB 公司开发,现为 Oracle 旗下产品。它以关联数据表的形式存储信息,将数据拆分为多个独立的表,从而提升查询效率与灵活性。MySQL 采用 SQL 作为标准查询语言,并遵循双授权模式,提供社区版和商业版。其社区版因体积小、速度快、源码开放等特点,成为许多中小型网站的首选数据库,常与 PHP 和 Apache 搭配使用。

环境搭建与基础操作

要使用 MySQL 存储和管理数据,需要完成以下步骤:安装 MySQL 服务端、安装 MySQL 客户端、客户端连接服务端、发送 SQL 命令执行增删改查等操作。


# 下载 MySQL
# http://dev.mysql.com/downloads/mysql/
# 安装(以 yum 为例)
yum install mysql-server

数据库与表管理

  • 显示所有数据库: SHOW DATABASES;(默认库:mysql、test、information_schema)
  • 切换数据库: USE db_name;
  • 显示当前库所有表: SHOW TABLES;

用户与权限管理

创建用户: CREATE USER '用户名'@'IP地址' IDENTIFIED BY '密码';

删除用户: DROP USER '用户名'@'IP地址';

修改用户名: RENAME USER '旧名'@'IP' TO '新名'@'IP';

修改密码: SET PASSWORD FOR '用户'@'IP' = PASSWORD('新密码');

查看权限: SHOW GRANTS FOR '用户'@'IP';

授权: GRANT 权限 ON 数据库.表 TO '用户'@'IP';(常用权限:select, insert, update, delete, all privileges 等)

撤销权限: REVOKE 权限 ON 数据库.表 FROM '用户'@'IP';

目标数据库格式:数据库名.*(所有表)、数据库名.表(指定表)、*.*(所有数据库)。

IP 格式:192.168.1.%(网段)或 %(任意 IP)。

基本数据类型

MySQL 数据类型主要分为数值、时间和字符串三大类。详情可参考官方文档:MySQL 数据类型

数据操作 (CRUD)

  • 插入: INSERT INTO 表 (列1, 列2) VALUES (值1, 值2); 或批量插入。
  • 删除: DELETE FROM 表 WHERE 条件;
  • 更新: UPDATE 表 SET 列=值 WHERE 条件;
  • 查询: SELECT * FROM 表 WHERE 条件; 支持排序 (ORDER BY)、分组 (GROUP BY)、连表 (INNER JOIN, LEFT JOIN)、组合 (UNION) 等。
  • 限制与通配符: LIMIT 起始行, 行数LIKE 'ale%'(多字符匹配),LIKE 'ale_'(单字符匹配)。

Python 操作 MySQL:pymysql

pymysql 是 Python 连接 MySQL 的纯 Python 库,用法与 MySQLdb 相似。

安装

pip3 install pymysql

基本使用示例

import pymysql

# 建立连接
conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123', db='t1')
# 创建游标
cursor = conn.cursor()

# 执行 SQL(返回受影响行数)
effect_rows = cursor.execute("UPDATE hosts SET host = '1.1.1.2'")

# 插入多条
cursor.executemany("INSERT INTO hosts(host, color_id) VALUES(%s, %s)", [("1.1.1.11",1), ("1.1.1.11",2)])

# 提交事务
conn.commit()

# 获取新增数据的自增 ID
new_id = cursor.lastrowid

# 查询数据
cursor.execute("SELECT * FROM hosts")
row = cursor.fetchone()      # 单行
rows = cursor.fetchmany(3)   # 多行
all_rows = cursor.fetchall() # 所有

# 移动游标(滚动)
cursor.scroll(1, mode='relative')  # 相对当前位置
cursor.scroll(2, mode='absolute')  # 绝对位置

# 关闭
cursor.close()
conn.close()

若希望查询结果以字典形式返回,可在创建游标时设置:

cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)

ORM 框架:SQLAlchemy

SQLAlchemy 是 Python 的 ORM 框架,它将对象映射为 SQL 语句,再通过数据库驱动执行。SQLAlchemy 本身不直接操作数据库,需配合 pymysql 等驱动使用。

底层使用示例

from sqlalchemy import create_engine

engine = create_engine("mysql+pymysql://root:123@127.0.0.1:3306/t1", max_overflow=5)

# 直接执行 SQL
cur = engine.execute("SELECT * FROM hosts")
data = cur.fetchall()

ORM 方式:定义表与操作

from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String, ForeignKey
from sqlalchemy.orm import sessionmaker
from sqlalchemy import create_engine

engine = create_engine("mysql+pymysql://root:123@127.0.0.1:3306/t1")
Base = declarative_base()

class User(Base):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True)
    name = Column(String(32))
    extra = Column(String(16))

# 创建表
Base.metadata.create_all(engine)

# 创建会话
Session = sessionmaker(bind=engine)
session = Session()

# 增
session.add(User(name='alex', extra='sb'))
session.commit()

# 删
session.query(User).filter(User.id > 2).delete()
session.commit()

# 改
session.query(User).filter(User.id == 1).update({"name": "new_name"})
session.commit()

# 查
users = session.query(User).all()
user = session.query(User).filter_by(name='alex').first()

SQLAlchemy 支持一对一、一对多、多对多关系,以及条件过滤、排序、分组、连表等高级查询。

远程服务器管理:Paramiko

Paramiko 是基于 SSH 协议的 Python 模块,用于连接远程服务器并执行命令或传输文件。

安装

pip3 install paramiko

SSHClient:执行远程命令

import paramiko

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(hostname='example.com', port=22, username='user', password='pass')

stdin, stdout, stderr = ssh.exec_command('ls -l')
result = stdout.read().decode()
print(result)

ssh.close()

使用密钥认证:

private_key = paramiko.RSAKey.from_private_key_file('/path/to/id_rsa')
ssh.connect(hostname='example.com', username='user', pkey=private_key)

SFTPClient:文件上传与下载

import paramiko

transport = paramiko.Transport(('example.com', 22))
transport.connect(username='user', password='pass')
sftp = paramiko.SFTPClient.from_transport(transport)

# 上传
sftp.put('/local/file.txt', '/remote/file.txt')
# 下载
sftp.get('/remote/file.txt', '/local/file.txt')

transport.close()

堡垒机(跳板机)实现

堡垒机用于集中管理服务器访问和记录操作日志。核心思路是:用户通过堡垒机认证后,选择一个目标服务器,堡垒机自动建立 SSH 连接,并将用户输入与远程输出实时转发。

示例:使用 selecttermios 实现交互式终端:

import paramiko
import sys
import select
import termios
import tty
from paramiko.py3compat import u

# 建立连接(略,参考上面的 SSHClient 用法)
# 打开会话并获取终端
chan = tran.open_session()
chan.get_pty()
chan.invoke_shell()

# 保存原终端属性
old_tty = termios.tcgetattr(sys.stdin)
try:
    tty.setraw(sys.stdin.fileno())
    chan.settimeout(0.0)
    while True:
        r, w, e = select.select([chan, sys.stdin], [], [])
        if chan in r:
            try:
                data = u(chan.recv(1024))
                if not data:
                    break
                sys.stdout.write(data)
                sys.stdout.flush()
            except:
                pass
        if sys.stdin in r:
            x = sys.stdin.read(1)
            if not x:
                break
            chan.send(x)
finally:
    termios.tcsetattr(sys.stdin, termios.TCSADRAIN, old_tty)

chan.close()
tran.close()

注意:若在 Windows 下使用,需通过线程模拟终端交互。

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。