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

相关推荐
java_logo5 小时前
Docker 部署微服务项目保姆级教程
java·运维·docker·微服务·容器·eureka·架构
冲上云霄的Jayden8 小时前
修改 Docker 容器中 MySQL 8.0 默认编码为 utf8mb4_unicode_ci
utf-8·mysql·ci/cd·docker·utf8mb4
zwjapple8 小时前
react+springboot的Docker部署
docker·部署·springboot·react
遇见火星9 小时前
Docker入门:快速部署你的第一个Web应用
前端·docker·容器
维诺菌11 小时前
k8s java应用pod内存占用过高问题排查
java·jvm·云原生·容器·性能优化·kubernetes
浪飘11 小时前
k8s device plugin
java·docker·kubernetes
冬夜戏雪11 小时前
milvus容器restart不成功,但docker仍在running问题排查
docker·容器·milvus
m0_5791466511 小时前
docker desktop的容器间通信
docker·容器·php
helloworddm11 小时前
Orleans 与 Kubernetes 结合的价值分析
云原生·容器·kubernetes