第十三章-数据库

1 数据库

  为了存储数据并且能够快速查询等功能专门形成的

  现代使用的数据库一般都是关系型数据库

  NoSQL尽管宣传其速度和规模远远超过关系数据库, 但是还是要先明白SQL

  常用的数据库有Oracle, SQL Server, DB2, MySQL, PostgreSQL, sqlite

2 使用SQLite

  SQLite就是一嵌入式的数据库, 数据库就是一个文件, 本身是c写的, 体积更小

  python中内置了SQLite3

  1) 建立数据库链接

db_file = os.path.join(os.path.dirname(__file__), 'test.db')
if os.path.isfile(db_file):
    os.remove(db_file)
conn = sqlite3.connect(db_file)

  2) 生成游标cursor

cursor = conn.cursor()

  3) 执行SQL语句

cursor.execute('create table user(id varchar(20) primary key, name varchar(20), score int)')
cursor.execute(r"insert into user values ('A-001', 'Adam', 95)")
cursor.execute(r"insert into user values ('A-002', 'Bart', 62)")
cursor.execute(r"insert into user values ('A-003', 'Lisa', 78)")

  4) 查询并获得结果

cursor.execute(r"SELECT name FROM user WHERE score > ? and score < ? ORDER BY score", (low, high))
values = cursor.fetchall()

  5) 关闭游标, 提交事务, 断开链接

cursor.close()
conn.commit()
conn.close()

3 使用mysql

  mysql是世界上使用最广泛的数据库服务器, 能够承受高并发

  mysql内部有多种数据库引擎, 最常用的引擎是支持数据库事务的lnnoDB

  设置编码为UTF8

  安装

pip install mysql-connector-python --allow-external mysql-connector-python
# 如果上述失败执行可以执行这句
pip install mysql-connector

  1) 建立连接并生成游标

import mysql.connector
conn = mysql.connector.connect(user='root', password='password', database='test')
cursor = conn.cursor()

  2) 执行语句, 查询和获得结果

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)
cursor.execute('select * from user where id = %s', ('1',))
values = cursor.fetchall()
print(values)

  3) 提交事务, 关闭游标关闭连接

conn.commit()
cursor.close()
conn.close()

4 使用SQLAlchemy

  数据库是一个二维表, 包含多行多列

  在Python可以构造一个结构来对应这个多行多列的表, 可以用一个列表存储整个表, 每一行用一个元组表示放入到列表中

  但是由于用元组表示一行还是不直观

  可以根据表格的内容, 对应一行的信息创建一个类, 那么每一行就是这个类的对象

  这就是ORM(object-relational mapping)

  在Python中最有名的orm框架是SQLAlchemy

  安装SQLAlchemy

pip install sqlalchemy

  使用SQLAlchemy

  1) 导入必要内容

from sqlalchemy import Column, String, create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base

  2) 创建对象类的基类

Base = declarative_base()

  3) 继承该基类创建对象类

class User(Base):
    # 表的名字:
    __tablename__ = 'user'

    # 表的结构:
    id = Column(String(20), primary_key=True)
    name = Column(String(20))

  4) 创建数据库链接

engine = create_engine('mysql+mysqlconnector://root:password@localhost:3306/test')

  链接格式为

'数据库类型+数据库驱动名称://用户名:口令@机器地址:端口号/数据库名'

  5) 将数据库链接绑定给sessionmaker来创建DBSession, 并生成session对象

DBSession = sessionmaker(bind=engine)
session = DBSession()

  6) 创建一个user对象并添加到表中

new_user = User(id='5', name='Bob')
session.add(new_user)
session.commit()
session.close()

  7) 执行查询操作

user = session.query(User).filter(User.id=='5').one()
print('type:', type(user))
print('name:', user.name)
session.close()

  其中query()用于创建一个查询

  filter()用于创建一个where条件

  one()表示返回一行, all()返回所有行

  关于对象之间的关系

    根据外键可以实现一对多, 多对多等关联

    一对多的关系设定如下

class User(Base):
    __tablename__ = 'user'

    id = Column(String(20), primary_key=True)
    name = Column(String(20))
    # 一对多:
    books = relationship('Book')

class Book(Base):
    __tablename__ = 'book'

    id = Column(String(20), primary_key=True)
    name = Column(String(20))
    # “多”的一方的book表是通过外键关联到user表的:
    user_id = Column(String(20), ForeignKey('user.id'))

  

 

posted @ 2017-05-23 17:25  weihuchao  阅读(272)  评论(0编辑  收藏  举报