Python浅谈-Python操作数据库之MySQL(1)
一、SQL:
关系型数据库,是指采用了关系模型来组织数据的数据库,其以行和列的形式存储数据,以便于用户理解,关系型数据库这一系列的行和列被称为表,一组表组成了数据库。用户通过查询来检索数据库中的数据,而查询是一个用于限
定数据库中某些区域的执行代码。关系模型可以简单理解为二维表格模型,而一个关系型数据库就是由二维表及其之间的关系组成的一个数据组织;
常见的关系型数据库有:Oracle、DB2、Microsoft SQL Server、Microsoft Access、MySQL等。
二、MySQL简介:
MySQL是一个关系型数据库管理系统,由瑞典MySQLAB公司开发,属于Oracle旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS(Relational Database Management System,
关系数据库管理系统) 应用软件之一;
MySQL所使用的 SQL(Structured Query Language,是1974年由Boyce和Chamberlin提出的一种介于关系代数与关系演算之间的结构化查询语言,是一个通用的、功能极强的关系性数据库语言。) 语言是用于访问数据库的最常用标准
化语言。MySQL 软件采用了双授权政策,分为社区版和商业版,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发都选择 MySQL 作为网站数据库;
三、MySQL的安装与使用:
可以使用的版本有MySQL社区版本和MariaDB两个版本,MySQL下载的地址为 https://dev.mysql.com/downloads/mysql/,MariaDB下载的地址为 https://downloads.mariadb.org/ ,选择合适的版本下载安装即可;
关于MariaDB与MySQL的关系可以参考 https://baike.baidu.com/item/mariaDB/6466119?fr=aladdin;
四、MySQL运行的原理:
1.存储引擎?
对表中数据的读取和写入的程序,默认为InnoDB(其他MyISAM、Memory),将表中的数据存储到磁盘;
以页作为磁盘和内存之间交互的基本单位,InnoDB中页的大小一般为16KB;
一次最少把内存中的16KB内容刷新到磁盘中,每一行都有固定的格式;

图 1 数据引擎所处的位置
2.事务的概念:
<1>.什么是事务:
操作数据库从读取到写入的整个流程,一组原子性的sql查询, 或者说一个独立的工作单元。
<2>.事务的特性:
原子性 Atomic
一致性 Consistency
隔离性 Isolation
持久性 Durable
五、使用Python操作MySQL数据库——SQLAIchemy:
1.SQLAIchemy?
Python SQL工具包和对象关系映射器;
SQLAlchemy是Python SQL工具包和对象关系映射器,它为应用程序开发人员 提供了SQL的全部功能和灵活性 ;
它提供了一套众所周知的企业级持久性模式, 专为高效和高性能的数据库访问而设计 ,适用于简单且Python化的领域语言;
作者:Mike Bayer 博客:https://techspot.zzzeek.org/
2.SQLAIchemy的使用思路(主要函数介绍):
declarative_base() ->创建基类
class -> 数据类 ->Table
create_engine -> 数据库引擎连接数据库
session -> 创建会话,类似事务
object -> 创建数据对
query -> 各种查询操作
3.Python操作:
下面是一个以主机和管理员多对多关系的一个简单的案例:
pip install SQLAIchemy # 安装库
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author:catt1e
from sqlalchemy import create_engine, Column ,Integer ,String, ForeignKey
from sqlalchemy.orm import sessionmaker, relationship
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import and_
from sqlalchemy import or_
Base = declarative_base()
class Admin(Base):
'''定义Admin表以及表的字段名'''
__tablename__= 'admin'
id = Column('id', Integer, primary_key=True)
name = Column('name', String(50), unique=True)
hosts = relationship(
'Host',
secondary='admin_host'
)
def __repr__(self):
return self.name
class Host(Base):
'''定义Host表以及表的字段名'''
__tablename__= 'host'
id = Column('id', Integer, primary_key=True)
name = Column('name', String(50), unique=True, nullable=False)
admins = relationship(
'Admin',
secondary='admin_host'
)
def __repr__(self):
return self.name
class AdminHost(Base):
'''定义AdminHost表以及表的字段名'''
__tablename__ = 'admin_host'
admin_id = Column(Integer, ForeignKey('admin.id'), primary_key=True)
host_id = Column(Integer, ForeignKey('host.id'), primary_key=True)
# engine = create_engine('mysql+pymysql://username:password@localhost/db')
engine = create_engine('mysql+pymysql://root:Pwdfordb826@localhost/catt1e?charset=utf8') # 引擎
Base.metadata.create_all(bind=engine) # 创建数据库,注意第一次创建完成后要注释,否则进行数据库操作会报错
# session
DBSession = sessionmaker(bind=engine) # 类
session = DBSession() # 实例
def add_admin(session, id, name):
'''添加管理员'''
s = Admin()
s.id = id
s.name = name
session.add(s)
return s
def main():
# 增加数据
# admin = add_admin(session, 4, 'admin_catt1e')
# h1 = Host(id=1100, name='webweb.server')
# h2 = Host(id=2200, name='dbdb.server')
# h3 = Host(id=3300, name='devdev.server')
# admin.hosts.append(h1)
# admin.hosts.append(h2)
# admin.hosts.append(h3)
# session.add(admin)
# session.commit()
# 查询数据
print('all: ', session.query(Admin).all())
print('admin catt1e: ', session.query(Admin).filter(Admin.name.endswith('catt1e')).one())
print('admin catt1e hosts: ', session.query(Admin).filter(Admin.name.endswith('catt1e')).one().hosts)
print('dbdb.server的管理员是谁,从用户表里开始查: ', session.query(Admin).filter(Admin.hosts.any(Host.name=='dbdb.server')).all())
if __name__ == '__main__':
main()