docker环境如何基于python操作mysql关系数据库

这里基于docker环境安装mysql,并使用python访问数据库,执行sql操作、恢复数据、检查语法。

测试数据和示例代码整理自网络资料。

1 mysql安装

首先是mysql安装,这里使用docker方案安装mysql。

假设docker已经安装,安装过程参考参考如下链接。

https://blog.csdn.net/liliang199/article/details/150067330

1.1 拉取镜像

docker pull mysql:8

1.2 验证镜像

docker images

1.3 持久化存储

mkdir -p /data/dockerData/mysql/{conf,data,logs}

1.4 启动数据库

创建配置文件

/data/dockerData/mysql/conf/my.cnf

mysql

default-character-set=UTF8MB4

mysqld

port=3306

max_connections=200

character-set-server=UTF8MB4

启动容器

docker run -d \

--name my-mysql \

-p 3306:3306 \

-v /data/dockerData/mysql/conf:/etc/mysql/conf.d \

-v /data/dockerData/mysql/data:/var/lib/mysql \

-v /data/dockerData/mysql/logs:/logs \

-e MYSQL_ROOT_PASSWORD=mysql \

mysql:8 sleep 9999999999999

登录容器

docker exec -it my-mysql bash

1.5 初始化数据库

登录mysql,密码是启动容器时设置的mysql

mysql -uroot -p

开放远程访问

UPDATE user SET host='%' WHERE user='root';

FLUSH PRIVILEGES;

创建数据库

CREATE DATABASE mydatabase

2 python连接

2.1 安装pymysql

首先安装pymysql

pip install pymysql

2.2 连接数据库

复制代码
import pymysql

# 创建数据库连接
db = pymysql.connect(
    host="localhost",
    user="root",
    password="mysql",
    database="mydatabase"
)
print("数据库连接成功!")

cursor = db.cursor()

2.3 创建表

复制代码
cursor.execute("""CREATE TABLE documents
             (id INT PRIMARY KEY     NOT NULL,
             name           TEXT    NOT NULL,
             retriever_name      TEXT    NOT NULL,
             pages            INT     NOT NULL,
             tag         TEXT    NOT NULL);""")

2.4 insert数据

导入如下数据,这里使用llama2和nvida a100 archtecture两个文档测试。

(1, 'llama2', 'retriever_1', 20, 'LLM')

(2, 'nvidia a100 architecture', 'retriever_2', 30, 'programming')

insert代码示例如下

复制代码
cursor.execute("INSERT INTO documents (id, name, retriever_name, pages, tag) VALUES (1, 'llama2', 'retriever_1', 20, 'LLM');")
cursor.execute("INSERT INTO documents (id, name, retriever_name, pages, tag) VALUES (2, 'nvidia a100 architecture', 'retriever_2', 30, 'programming');")

db.commit()

2.5 查询数据

复制代码
sql = "SELECT * FROM documents WHERE name = %s"
name = ("llama2",)
cursor.execute(sql, name)
results = cursor.fetchall()
for row in results:
    print(row)

输出如下

(1, 'llama2', 'retriever_1', 20, 'LLM')

2.6 删除表

复制代码
cursor.execute("DROP TABLE contracts;")

3 数据库恢复

3.1 准备sql文件

基于现有的sql文件恢复数据库,这里sql文件来自chinook-database的如下连接。

https://github.com/lerocha/chinook-database/blob/master/ChinookDatabase/DataSources/Chinook_MySql.sql

3.2 运行恢复程序

恢复程序如下所示,运行完成即完成数据库恢复。

复制代码
#!/usr/bin/env python3
# coding: utf-8
import pymysql

sql_host = 'localhost'
sql_user = 'root'  # 数据库登陆用户
sql_pwd = 'mysql'  # 数据库登陆密码
database_name = 'mydatabase'  # 数据库名字
sql_path = './Chinook_MySql.sql'  # 存放sql文件的地址

connect = pymysql.connect(host=sql_host, user=sql_user, password=sql_pwd, database=database_name)
cursor = connect.cursor()
try:
    with open(sql_path,encoding='utf-8',mode='r') as f:
        # 读取整个sql文件,以分号切割。[:-1]删除最后一个元素,也就是空字符串
        sql_list = f.read().split('\n')
        sql_cmd = ""
        for x in sql_list:
            sql_cmd += x
            # sql语句添加分号结尾
            if str(sql_cmd).strip().endswith(";") == True:
                cursor.execute(sql_cmd)
                print("执行成功sql: %s"%sql_cmd)
                sql_cmd = ""
        if str(sql_cmd).strip().endswith(";") == True:
            cursor.execute(sql_cmd)
            print("执行成功sql: %s"%sql_cmd)
except Exception as e:
    print(e)
    print('执行失败sql: %s'%sql_cmd)
finally:
    # 关闭mysql连接
    cursor.close()
    connect.commit()
    connect.close()

4 语法检查

4.1 安装sqlparse

安装sql语法检查包

pip install sqlparse

4.2 语法检查

语法检查示例程序

复制代码
# 解析SQL语句
import sqlparse

def check_sql_syntax(sql):
    try:
        parsed = sqlparse.parse(sql)
        if not parsed:
            return False, "Invalid SQL syntax"
        return True, "SQL syntax is correct"
    except Exception as e:
        return False, str(e)

sql = "SELECT * FROM users WHERE id = 1"
is_valid, message = check_sql_syntax(sql)
print(message)

reference


docker安装mysql详细指南(2025最新版)

https://www.cnblogs.com/baofuba187/p/19057123

MySQL Python 连接与使用

https://www.runoob.com/mysql/mysql-python-intro.html

chinook-database

https://github.com/lerocha/chinook-database/tree/master

使用Python脚本高效导入MySQL数据库的SQL文件教程

https://www.oryoy.com/news/shi-yong-python-jiao-ben-gao-xiao-dao-ru-mysql-shu-ju-ku-de-sql-wen-jian-jiao-cheng-1.html

python如何检查sql语法

https://docs.pingcode.com/baike/864425

llama2

https://arxiv.org/pdf/2307.09288

nvidia a100白皮书pdf

https://images.nvidia.cn/aem-dam/en-zz/Solutions/data-center/nvidia-ampere-architecture-whitepaper.pdf

相关推荐
张忠琳16 小时前
【NVIDIA】 NVIDIA Container Toolkit v1.19.1 — OCI 模块超深度分析之三
云原生·容器·架构·kubernetes·nvidia
Elastic 中国社区官方博客18 小时前
将你的 Grafana Kubernetes 仪表板迁移到 Elastic Observability:相同的 PromQL,30 倍更快的查询
大数据·人工智能·elasticsearch·搜索引擎·容器·kubernetes·grafana
风曦Kisaki21 小时前
#企业级docker私有仓库构建:harbor仓库与阿里云镜像仓库
阿里云·docker·容器
期待着201321 小时前
docker 安装 ,在centos7.9
运维·docker·容器
骑上单车去旅行1 天前
Docker Compose 命令完全指南:从构建到运维
docker·容器·eureka
前端Baymax1 天前
K8s PodCrashLoopBackOff假阳性排查
云原生·容器·kubernetes
spider_xcxc1 天前
K8s 部署学习笔记
docker·容器·kubernetes·云计算·k8s
java_logo1 天前
Docker Compose 部署 Apache Superset:轻松搭建开源 BI 平台
docker·开源·apache·superset·轩辕镜像·superset部署方案·docker superset
zy happy1 天前
VMware虚拟机添加新的硬盘
java·linux·jvm·docker
阿标在干嘛2 天前
从物理机到K8s:政策快报平台的容器化部署实践
云原生·容器·kubernetes