数据
程序运行时数据都被载入内存,运行结束后数据会被保存到磁盘上,无论是保存到本地磁盘还是通过网络保存到服务器上,最终都会讲数据写入磁盘文件。
数据的存储格式是保存数据时会面临的一个大问题。比如我们要保存一个班级里所有学生的成绩单:
name | grade |
---|---|
alice | 98 |
bob | 95 |
cindy | 91 |
lisa | 94 |
gabby | 80 |
我们可以用文本文档保存,用空格或是
,
作为分隔符:
alice,98
bob,95
cindy,91
lisa,94
gabby,80
也可以用json格式保存:
[
{“name”:“alice”,“score”:98}
{“name”:“bob”,“score”:95}
{“name”:“cindy”,“score”:91}
{“name”:“lisa”,“score”:94}
{“name”:“gabby”,“score”:80}
]
数据库
为了实现数据的存储和查询,便出现了数据库(database)这种软件。
数据库类别
付费:oracle、SQL server、DB2和Sybase
免费开源:MySQL、postgreSQL、sqlite
MySQL具有免费、普及率高以及具有多种监控运维工具的特点,是Python开发人员的首选。
sqlite
sqlite概述
这是一种嵌入式数据库,它的数据库就是一个文件。具有轻量级、可嵌入的特点,但是不能承受高并发访问,适合桌面和移动应用。
表示数据库存放关系数据的集合,一个数据库里面通常都包含多个表,表与表之间通过外键关联。要对数据库进行操作首先需要使用connect连接数据库,连接完成之后要打开游标cursor,通过游标执行SQL语句获取执行结果。
实现建库、插入和查询
#!/usr/bin/python3
# coding=utf-8
import sqlite3
#连接到数据库,若文件不存在则在当前目录创建
conn = sqlite3.connect('test.db')
# 创建cursor
cursor = conn.cursor()
# 创建一个user表
cursor.execute('create table user (id varchar(20) primary key, name varcha(20))')
# 插入一个记录
cursor.execute('insert into user(id, name) values(\'1\',\'Michael\')')
# 获取插入的行数
print(cursor.rowcount)
# 执行查询语句
cursor.execute('select * from user where id=?',('1',))
values = cursor.fetchall()
print(values)
cursor.close()
conn.commit()
conn.close()
注意事项
- 记住
connection
和cursor
对象,打开后记得关闭。 - 使用
cursor
对象执行insert
,update
,delete
语句时,执行结果由rowcount
返回,返回值是作用的行数。 - 使用
cursor
对象执行Select
语句时通过fetchall()
拿到结果集。返回结果是一个list
,每个元素是一个tuple
,对应一个记录。 - 如果SQL语句带有参数,那么需要把参数按照位置传递给execute()方法,有几个
?
占位符就必须对应几个参数,比如:
cursor.execute('select * from user where name=? and pwd=', ('abc',' password'))
小结
- 在Python中操作数据库时,要先导入数据库对应的驱动,然后通过
connection
对象和cursor
对象操作数据。 - 要确保打开的
connection
和cursor
对象被正确地关闭,否则资源就会泄露。 - 可以通过
try...except....finally
的方法确保连接和游标被关闭
mysql
mysql概述
MySQL是web界面使用最广泛的数据库服务器,是为服务器端设计的数据库,能够承受高并发刚问,占用的内存比较大。
实现建库、插入和查询
#!/usr/bin/python3
# coding=utf-8
import mysql.connector
conn = mysql.connector.connect(user='root',password='password',database='test')
cursor = conn.cursor()
cursor.execute('create table user (id varchar(20) primary key, name varchar(20))')
cursor.execute('insert into user (id, name) values (%s, %s)', ['1', 'Michael'])
print(cursor.rowcount)
conn.commit()
cursor.close()
小结
- 执行INSERT等操作后要调用commit()提交事务;
- MySQL的SQL占位符是%s。
使用SQLAlchemy
数据库是一个包含多行多列的二维表,把一个表用Python的数据结构表示出来可以用一个list表示多行,list中的每个元素是tuple,包含每条记录的关键字和属性。
object-relational mapping:将关系数据库的表结构映射到对象需要一个转换器,最著名的框架是SQLalchemy。
安装:pip3 install sqlalchemy
使用:前文已经创建了一个user表,此处我们直接使用即可
#!/usr/bin/python3
# coding=utf-8
# 导入:
from sqlalchemy import Column, String, create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base
# 创建对象的基类:
Base = declarative_base()
# 定义User对象:
class User(Base):
# 表的名字:
__tablename__ = 'user'
# 表的结构:
id = Column(String(20), primary_key=True)
name = Column(String(20))
# 初始化数据库连接:
engine = create_engine('mysql+mysqlconnector://root:password@localhost:3306/test')
# 创建DBSession类型:
DBSession = sessionmaker(bind=engine)
小结
ORM框架是将数据库表的一行记录与一个对象互相做自动转换。
总结
利用Python进行数据库操作有很多种方法,之后可以进行详细的学习。