MySQL学习入门

好的!以下是一个详细的 MySQL 入门学习文档,针对 Python 开发者,包含使用 SQLite 进行学习的示例。文档将涵盖实际开发中需要使用的各种相关操作和知识,帮助您从基础开始,逐步掌握在 Python 中使用 MySQL 的技能。


MySQL 入门学习文档

目录

  1. 简介
  2. 环境搭建
    • 2.1 安装 MySQL
    • 2.2 安装 Python 和 虚拟环境
    • 2.3 安装数据库连接库
  3. SQL 基础
    • 3.1 数据库和表
    • 3.2 数据类型
    • 3.3 基本 SQL 语句
  4. Python 操作 MySQL
    • 4.1 连接到数据库
    • 4.2 执行 SQL 语句
    • 4.3 事务处理
    • 4.4 处理异常
  5. 使用 ORM:SQLAlchemy
    • 5.1 安装 SQLAlchemy
    • 5.2 定义模型
    • 5.3 创建和查询数据
    • 5.4 更新和删除数据
  6. 使用 SQLite 进行练习
    • 6.1 SQLite 简介
    • 6.2 在 Python 中使用 SQLite
  7. 实际开发中的注意事项
    • 7.1 数据库设计
    • 7.2 性能优化
    • 7.3 安全性考虑
  8. 部署 MySQL 服务
    • 8.1 在本地部署 MySQL
    • 8.2 在服务器上部署 MySQL
  9. 附加资源
  10. 总结

1. 简介

MySQL 是一种流行的开源关系型数据库管理系统(RDBMS),广泛应用于 Web 开发和各种应用程序。它以高性能、可靠性和易用性著称。

对于 Python 开发者,了解如何与 MySQL 进行交互是非常重要的技能。本学习文档将指导您:

  • 理解 MySQL 的基本概念和 SQL 语句
  • 在 Python 中连接并操作 MySQL 数据库
  • 使用 ORM(对象关系映射)工具,如 SQLAlchemy,提高开发效率
  • 学习实际开发中需要注意的各种操作和知识

2. 环境搭建

2.1 安装 MySQL

2.1.1 下载 MySQL
  • 访问 MySQL 官方网站 下载适合您操作系统的 MySQL 安装包。
2.1.2 安装 MySQL
  • 根据下载的安装包,按照安装向导进行安装。
  • 在安装过程中,设置 root 用户的密码,并记住它,后续需要使用。
2.1.3 配置 MySQL
  • 安装完成后,确保 MySQL 服务已启动。
  • 可以使用命令行或图形化工具(如 MySQL Workbench)连接到 MySQL。
2.1.4 验证安装
  • 打开命令行,输入以下命令测试连接:

    mysql -u root -p
    
  • 输入密码后,应能进入 MySQL 命令行界面。

2.2 安装 Python 和 虚拟环境

2.2.1 安装 Python
  • 访问 Python 官网 下载并安装 Python 3.6 或更高版本。
2.2.2 创建虚拟环境
  • 使用虚拟环境隔离项目依赖。

    python -m venv venv
    
  • 激活虚拟环境:

    • Windows:

      venv\Scripts\activate
      
    • macOS/Linux:

      source venv/bin/activate
      

2.3 安装数据库连接库

2.3.1 选择数据库驱动
  • 常用的 MySQL 数据库驱动有:
    • mysql-connector-python:由 Oracle 官方提供。
    • PyMySQL:纯 Python 实现。
    • mysqlclient:需要编译,性能较好。
  • 本文将使用 PyMySQL,因为它易于安装且无需编译。
2.3.2 安装 PyMySQL
pip install PyMySQL
2.3.3 安装 SQLAlchemy(可选)
  • 后续将介绍如何使用 ORM 工具 SQLAlchemy。
pip install sqlalchemy

3. SQL 基础

在开始编写代码之前,了解一些 SQL 基础知识是非常有必要的。

3.1 数据库和表

  • 数据库:数据的集合,每个数据库包含多个表。
  • :由行和列组成的结构,用于存储数据。

3.2 数据类型

  • 数值类型:INT、FLOAT、DOUBLE、DECIMAL
  • 字符串类型:CHAR、VARCHAR、TEXT
  • 日期和时间类型:DATE、TIME、DATETIME、TIMESTAMP

3.3 基本 SQL 语句

3.3.1 创建数据库
CREATE DATABASE mydatabase;
3.3.2 使用数据库
USE mydatabase;
3.3.3 创建表
CREATE TABLE users (id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(100),email VARCHAR(100),age INT
);
3.3.4 插入数据
INSERT INTO users (name, email, age) VALUES ('Alice', 'alice@example.com', 30);
3.3.5 查询数据
SELECT * FROM users;
3.3.6 更新数据
UPDATE users SET age = 31 WHERE name = 'Alice';
3.3.7 删除数据
DELETE FROM users WHERE name = 'Alice';

4. Python 操作 MySQL

4.1 连接到数据库

4.1.1 导入 PyMySQL
import pymysql
4.1.2 建立连接
connection = pymysql.connect(host='localhost',user='root',password='your_password',database='mydatabase',charset='utf8mb4',cursorclass=pymysql.cursors.DictCursor
)

说明:

  • host:数据库服务器地址,默认本地为 localhost
  • user:数据库用户名,默认管理员为 root
  • password:对应用户的密码。
  • database:要连接的数据库名称。
  • charset:字符集设置为 utf8mb4,支持 Emoji 等字符。
  • cursorclass:指定返回结果为字典形式。
4.1.3 测试连接
try:with connection.cursor() as cursor:cursor.execute("SELECT VERSION()")result = cursor.fetchone()print("Database version:", result)
finally:connection.close()

4.2 执行 SQL 语句

4.2.1 创建表
try:with connection.cursor() as cursor:sql = """CREATE TABLE IF NOT EXISTS users (id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(100),email VARCHAR(100),age INT)"""cursor.execute(sql)connection.commit()
finally:connection.close()
4.2.2 插入数据
try:with connection.cursor() as cursor:sql = "INSERT INTO users (name, email, age) VALUES (%s, %s, %s)"cursor.execute(sql, ('Bob', 'bob@example.com', 25))connection.commit()
finally:connection.close()
4.2.3 查询数据
try:with connection.cursor() as cursor:sql = "SELECT * FROM users WHERE age > %s"cursor.execute(sql, (20,))results = cursor.fetchall()for row in results:print(row)
finally:connection.close()
4.2.4 更新数据
try:with connection.cursor() as cursor:sql = "UPDATE users SET age = %s WHERE name = %s"cursor.execute(sql, (26, 'Bob'))connection.commit()
finally:connection.close()
4.2.5 删除数据
try:with connection.cursor() as cursor:sql = "DELETE FROM users WHERE name = %s"cursor.execute(sql, ('Bob',))connection.commit()
finally:connection.close()

4.3 事务处理

  • 默认情况下,PyMySQL 会自动开启事务。
  • 使用 connection.commit() 提交事务。
  • 使用 connection.rollback() 回滚事务。
4.3.1 示例:事务操作
try:with connection.cursor() as cursor:sql1 = "INSERT INTO users (name, email, age) VALUES (%s, %s, %s)"sql2 = "UPDATE accounts SET balance = balance - %s WHERE user_id = %s"cursor.execute(sql1, ('Charlie', 'charlie@example.com', 28))cursor.execute(sql2, (100, 1))connection.commit()
except Exception as e:connection.rollback()print("Transaction failed:", e)
finally:connection.close()

4.4 处理异常

  • 在数据库操作中,可能会发生各种异常,需要进行捕获和处理。
4.4.1 常见异常
  • pymysql.err.InternalError:内部错误
  • pymysql.err.OperationalError:操作错误,如连接失败
  • pymysql.err.IntegrityError:完整性错误,如主键重复
4.4.2 异常处理示例
import pymysqltry:# 数据库操作pass
except pymysql.err.IntegrityError as e:print("Integrity error:", e)
except pymysql.err.OperationalError as e:print("Operational error:", e)
except Exception as e:print("Unexpected error:", e)
finally:connection.close()

5. 使用 ORM:SQLAlchemy

5.1 安装 SQLAlchemy

pip install sqlalchemy

5.2 定义模型

5.2.1 导入模块
from sqlalchemy import Column, Integer, String, create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
5.2.2 创建数据库引擎
engine = create_engine('mysql+pymysql://root:your_password@localhost/mydatabase')
5.2.3 创建基类
Base = declarative_base()
5.2.4 定义模型类
class User(Base):__tablename__ = 'users'id = Column(Integer, primary_key=True)name = Column(String(100))email = Column(String(100))age = Column(Integer)def __repr__(self):return f"<User(name='{self.name}', email='{self.email}', age={self.age})>"
5.2.5 创建表
Base.metadata.create_all(engine)

5.3 创建和查询数据

5.3.1 创建会话
Session = sessionmaker(bind=engine)
session = Session()
5.3.2 添加数据
new_user = User(name='David', email='david@example.com', age=35)
session.add(new_user)
session.commit()
5.3.3 查询数据
users = session.query(User).filter(User.age > 30).all()
for user in users:print(user)

5.4 更新和删除数据

5.4.1 更新数据
user = session.query(User).filter_by(name='David').first()
user.age = 36
session.commit()
5.4.2 删除数据
user = session.query(User).filter_by(name='David').first()
session.delete(user)
session.commit()

6. 使用 SQLite 进行练习

6.1 SQLite 简介

  • SQLite 是一个轻量级的嵌入式关系型数据库,无需单独安装服务器。
  • 适合用于学习和开发阶段的测试。

6.2 在 Python 中使用 SQLite

6.2.1 使用内置模块 sqlite3
import sqlite3connection = sqlite3.connect('test.db')
cursor = connection.cursor()
6.2.2 执行 SQL 语句
cursor.execute('CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT)')
cursor.execute('INSERT INTO users (name) VALUES (?)', ('Eve',))
connection.commit()
6.2.3 查询数据
cursor.execute('SELECT * FROM users')
rows = cursor.fetchall()
for row in rows:print(row)
6.2.4 关闭连接
connection.close()
6.2.5 使用 SQLAlchemy 操作 SQLite
  • 修改数据库引擎的连接字符串:

    engine = create_engine('sqlite:///test.db')
    
  • 其余操作与 MySQL 基本一致。


7. 实际开发中的注意事项

7.1 数据库设计

  • 规范化:避免数据冗余,确保数据一致性。
  • 命名规范:表名、字段名应具有意义,遵循命名规则。
  • 主键和外键:设计合适的主键,使用外键维护表之间的关系。
  • 索引:为常用的查询字段添加索引,提高查询性能。

7.2 性能优化

  • 使用索引:加速查询,但过多的索引会影响写入性能。
  • 查询优化:避免使用 SELECT *,仅选择需要的字段。
  • 分页查询:对于大量数据,使用分页避免一次性加载过多数据。
  • 连接池:在 Python 中使用数据库连接池,减少连接开销。

7.3 安全性考虑

  • 防止 SQL 注入:使用参数化查询或 ORM,避免直接拼接 SQL。
  • 加密敏感数据:对密码等敏感信息进行哈希或加密存储。
  • 权限管理:限制数据库用户的权限,只授予必要的权限。
  • 备份和恢复:定期备份数据库,制定恢复计划。

8. 部署 MySQL 服务

8.1 在本地部署 MySQL

  • 安装 MySQL:参考环境搭建部分。

  • 配置远程访问:如果需要其他机器访问本地 MySQL,需要配置允许远程连接。

    -- 在 MySQL 命令行中执行
    GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'your_password' WITH GRANT OPTION;
    FLUSH PRIVILEGES;
    
  • 修改配置文件:编辑 my.cnfmy.ini,注释掉或修改 bind-address

    # bind-address = 127.0.0.1
    
  • 重启 MySQL 服务

8.2 在服务器上部署 MySQL

  • 选择服务器:可以使用云服务器(如 AWS、阿里云、腾讯云等)。
  • 安装 MySQL:根据服务器的操作系统,安装对应版本的 MySQL。
  • 安全配置
    • 设置强密码。
    • 禁止 root 用户远程登录,创建专用的数据库用户。
    • 开启防火墙,仅开放必要的端口(如 3306)。
    • 使用 SSL 加密连接。
  • 备份策略:配置自动备份,防止数据丢失。

9. 附加资源

  • MySQL 官方文档:https://dev.mysql.com/doc/
  • PyMySQL 文档:https://pymysql.readthedocs.io/
  • SQLAlchemy 文档:https://docs.sqlalchemy.org/
  • MySQL 教程:菜鸟教程 MySQL
  • SQL 基础教程:W3Schools SQL Tutorial

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/60654.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI模型---安装cuda与cuDNN

1.安装cuda 先打开cmd 输入nvidia-smi 查看显卡支持cuda对应的版本&#xff1a; 然后去英伟达官网下载cuda&#xff08;外网多刷几次&#xff09; https://developer.nvidia.com/cuda-toolkit-archive 注意对应版本 安装过程中如果显示如下图&#xff1a; 请安装visual Stu…

ajax (一)

什么是 AJAX [ˈeɪdʒks] &#xff1f; 概念&#xff1a;AJAX是浏览器与服务器进行 数据通信 的技术&#xff0c;动态数据交互 怎么用AJAX? 1. 先使用 axios [k‘sio ʊ s] 库&#xff0c; 与服务器进行 数据通信 ⚫ 基于 XMLHttpRequest 封装、代码简单、月下载量在 1…

Load-Balanced-Online-OJ(负载均衡式在线OJ)

负载均衡式在线OJ 前言1. 项目介绍2. 所用技术与环境所用技术栈开发环境 3. 项目宏观结构3.1 项目核心模块3.2 项目的宏观结构 4. comm公共模块4.1 日志&#xff08;log.hpp &#xff09;4.1.1 日志主要内容4.1.2 日志使用方式4.1.2 日志代码 4.2 工具&#xff08;util.hpp&…

微信小程序上传微信官方审核流程(1)

1&#xff0c;打开微信开发者工具 2&#xff0c;微信开发者工具右上角有一个上传按钮&#xff0c;点击上传按钮 3&#xff0c;点击完上传按钮会弹出一个上传成功的提示&#xff0c;点击提示框中的确定按钮 4&#xff0c;点击完确定按钮后会显示填写版本好和项目备注 5&#x…

数据结构(Java版)第一期:时间复杂度和空间复杂度

目录 一、数据结构的概念 1.1. 什么是数据结构 1.2. 算法与数据结构的关系 二、算法效率 三、时间复杂度 3.1. 大O的渐进表⽰法 3.2. 计算冒泡排序的时间复杂度 3.3. 计算二分查找的时间复杂度 四、空间复杂度 4.1. 空间复杂度 4.2. 冒泡排序的空间复杂度 4.3.…

微信小程序全局配置:导航栏、下拉刷新与上拉触底设置教程

微信小程序全局配置:导航栏、下拉刷新与上拉触底设置教程 引言 微信小程序作为一种新兴的轻量级应用,凭借其便捷性和丰富的功能受到了广泛的欢迎。在开发小程序的过程中,合理配置全局属性是提升用户体验的关键。本文将深入探讨小程序的全局配置中的window选项,重点介绍导…

语言模型中的多模态链式推理

神经网络的公式推导 简介摘要引言多模态思维链推理的挑战多模态CoT框架多模态CoT模型架构细节编码模块融合模块解码模块 实验结果运行代码补充细节安装包下载Flan-T5数据集准备rougenltkall-MiniLM-L6-v2运行 简介 本文主要对2023一篇论文《Multimodal Chain-of-Thought Reason…

LLaMA-Mesh: Unifying 3D Mesh Generation with Language Models 论文解读

目录 一、概述 二、相关工作 1、LLMs到多模态 2、3D对象生成 3、自回归的Mesh生成 三、LLaMA-Mesh 1、3D表示 2、预训练模型 3、有监督的微调数据集 4、数据集演示 四、实验 1、生成的多样性 2、不同模型text-to-Mesh的比较 3、通用语境的评估 一、概述 该论文首…

【Go】-go中的锁机制

目录 一、锁的基础知识 1. 互斥量/互斥锁 2. CAS&#xff08;compare and swap&#xff09; 3. 自旋锁 4. 读写锁 5. 乐观锁 & 悲观锁 6. 死锁 二、go中锁机制 1. Mutex-互斥锁 2. RWMutex-读写锁 2.1 RWMutex流程概览 2.2 写锁饥饿问题 2.3. golang的读写锁源…

.NET9 - 新功能体验(二)

书接上回&#xff0c;我们继续来聊聊.NET9和C#13带来的新变化。 01、新的泛型约束 allows ref struct 这是在 C# 13 中&#xff0c;引入的一项新的泛型约束功能&#xff0c;允许对泛型类型参数应用 ref struct 约束。 可能这样说不够直观&#xff0c;简单来说就是Span、ReadO…

抗癌药物“曲妥珠单抗”,或将纳入2025版《中国药典》!

在抗癌药物的浩瀚星空中&#xff0c;曲妥珠单抗如同一颗璀璨的星辰&#xff0c;以其卓越的治疗效果和广泛的应用前景&#xff0c;照亮了无数HER2阳性癌症患者的生命之路。近日&#xff0c;从国家药典委员会传来振奋人心的消息——注射用曲妥珠单抗正式进入《中国药典》2025版国…

JavaParser 的全面介绍

JavaParser 是什么&#xff1f; JavaParser 的快速介绍可以参考&#xff1a; # JavaParser的快速介绍 JavaParser是一个用于解析Java源码的开源工具&#xff0c;它提供了一种简单而有效的方式来解析和操作Java代码。JavaParser解析源码的方式主要基于其将Java代码转换为抽象语…

图形化界面MySQL(MySQL)(超级详细)

1.官网地址 MySQL :: Download MySQL Workbench 1.1在Linux直接点击NO thanks..... 下载完后是这个页面 1.2任何远端登录&#xff0c;再把jj数据库给授权 1.3建立新用户 进行连接 点击这个就运行了 只执行show tables&#xff1b;要先选中 圆圈处支持自己输入 点击这个就执…

【夹板涨停战法】技术形态,原理和操盘技术图文教程

夹板涨停战法的基本形态和原理 夹板涨停是指两股强大的做多力量以夹击的方式紧紧的封夹空头&#xff0c;把空头力量打趴下&#xff0c;让空头的做空希望被破灭。 两股强大的多头力量对付空头&#xff0c;多头战胜&#xff0c;轻易灭掉空头&#xff0c;一切在强大做多力量的把…

【2024 Optimal Control 16-745】Julia语法

Lecture 2 θ和它的导数符号是通过 Julia 中的变量命名方式实现的 变量 θ 的输入&#xff1a; 在 Julia 中&#xff0c;θ 是一个合法的变量名&#xff0c;就像普通的字母 x 或 y 一样。要输入 θ&#xff0c;可以使用以下方法&#xff1a; 在 Jupyter Notebook 或 Julia REP…

Java项目实战II基于SPringBoot的玩具销售商城管理系统(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、核心代码 五、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 随着儿童娱乐与教育需求的…

Linux系统使用valgrind分析C++程序内存资源使用情况

内存占用是我们开发的时候需要重点关注的一个问题&#xff0c;我们可以人工根据代码推理出一个消耗内存较大的函数&#xff0c;也可以推理出大概会消耗多少内存&#xff0c;但是这种方法不仅麻烦&#xff0c;而且得到的只是推理的数据&#xff0c;而不是实际的数据。 我们可以…

stm32如何接收舵机的控制信号(而不是控制舵机)

看到很多如何stm32用pwm信号控制舵机的文章,老生常谈了 我来写一个stm32接收pwm信号的例子 ,这个pwm信号是用来控制舵机的 背景: 我需要接收航模接收机的,用来控制舵机的pwm信号, 得到这个信号后,做其他事情. 初版代码 pwm.h#ifndef _pwm_H #define _pwm_H#include "s…

RK3588 HDMI2.1电路参考设计原理

RK3588是瑞芯微电子&#xff08;Rockchip&#xff09;旗下的一款高性能应用处理器芯片&#xff0c;采用了ARM的big.LITTLE架构&#xff0c;结合了四个高性能的Cortex-A76核心和四个高效能的Cortex-A55核心。 big.LITTLE技术通过结合高性能的“大核”&#xff08;big cores&…

【大数据学习 | Spark-Core】详解分区个数

RDD默认带有分区的&#xff0c;那么创建完毕rdd以后他的分区数量是多少&#xff1f; 从hdfs读取文件的方式是最正规的方式&#xff0c;我们通过计算原理可以推出blk的个数和分区数量是一致的&#xff0c;本地化计算。 我们可以发现数据的读取使用的是textInputFormat&#xff…