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_logo3 小时前
OpenCode 企业级 Docker 部署完整指南
运维·docker·容器·opencode·opencode本地化部署·opencode部署手册·opencode部署方案
再战300年4 小时前
docker下创建redis集群方案
redis·docker·容器
qq_229058015 小时前
docker中检测进程的内存使用量
java·docker·容器
java_logo5 小时前
使用 Docker 部署 Clawdbot(官方推荐方式)
docker·容器·clawdbot·clawdbot部署·clawdbot部署手册·clawdbot部署文档·docker clawdbot
玉树临风江流儿6 小时前
docker镜像加速器配置步骤
运维·docker·容器
短剑重铸之日7 小时前
《SpringCloud实用版》生产部署:Docker + Kubernetes + GraalVM 原生镜像 完整方案
后端·spring cloud·docker·kubernetes·graalvm
lots洋8 小时前
使用docker-compose安装mysql+redis+nacos
redis·mysql·docker
GHL2842710909 小时前
Docker Desktop 启动报错“Virtualization support not detected“
c++·docker·容器
susu108301891110 小时前
docker启动kafka
docker·容器·kafka
何以不说话11 小时前
记录一下学习日常⑩(docker)
linux·运维·docker·容器