十八:访问数据库:
1:使用SQLite
SQLite 是一种嵌入式数据库,他的数据库就是一种文件,由于SQLite 本身是C写的 而且体积很小,所以被经常集成到各种应用程序中,甚至是iOS和Android的app中都有继承
Python就内置了SQLite3 ,要操作关系数据库,首先需要链接到数据库 一个数据库的链接称之为connection 连接到数据库后,需要打开游标 称之为cursor 通过cursor执行SQL语句
#导入SQLite驱动
>>>import sqlite3
#连接到SQLite数据库
#数据库文件是test.db
#如果文件不存在,会自动在当前目录中创建
>>>conn=sqlite3.connect('test.db')
#创建一个cursor
>>>cursor=conn.cursor()
#执行一条SQL语句 创建user表
>>>cursor.execute('create table user (id varchar(20) primary key, name varchar(20))')
<sqlite3.Cursor object at 0x 38429342>
#继续执行一条SQL语句 插入一条记录
>>>cursor.execute('insert into user(id name) values(\'1\',\'lc\')')
<sqlite3.Cursor object at 0x 384df29342>
#通过rowcount获得插入的行数
>>>cursor.rowcount
1
#关闭cursor
>>>cursor.close()
#提交事物
>>>conn.commit()
#关闭链接
>>>conn.colse()
试一试查询 ,查询可以如下:
>>>conn=sqlite3.connect('test.db')
>>>cursor=conn.cursor()
#执行查询语句
>>>cursor.execute('select * from user where id =?','1')
<sqlite3.Cursor object at 0x 38429342>
#获得查询结果
>>>values=cursor.fetchall()
>>>values
[(u'1',u'lc')]
>>>cursor.close()
>>>conn.close()
2:使用mysql
安装mysql 然后 修改配置文件
[client]
default-character-set=utf8
[mysqld]
default-storage-engine=INNODB
character-set-server=utf8
collation-server=utf8_general_ci
修改完毕后 用mysql命令 查看 show variables like '%char%' 让所有的编码都为utf8
安装mysql的Python驱动
$easy_install mysql-connector-python
$easy_install MySQL-python
前者是mysql官方的纯Python驱动 后者是封装了mysql C驱动的Python驱动
以mysql-connector-python 为例:
#导入mysql驱动
>>>import mysql.connector
#建立连接
>>>conn=mysql.connnector.connect(user='root',password='123456',database='pythonstudy',user_unicode=True)
>>>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','lc'])
>>>cursor.rowcount
1
>>>conn.commit()
>>>corsor.close()
>>>cursor=conn.cursor()
>>>cursor.execute('select * from user where id =%s' ,'1')
>>>values=cursor.fetchall()
>>>values
[(u'1',u'lc')]
>>>cursor.close()
>>>conn.close()
注意 在Python中mysql的占位符是%s 通常我们在连接mysql的时候 传入use_unicode=True 让mysql的DB-API始终返回Unicode
3:使用SQLAlchemy
数据库就是一个二维表,包含很多行很多列,把一个表的内容用Python的数据结构表示出来的话,可以用一个list表示多行 list的每一个元素都是一个tuple 表示一行记录 如
[('1','lc'),('2','xxb'),('3','xxw')]
Python的DB-API返回的数据结构就是上面这样表示的
但是tuple表示一行很难看出表的结构 如果把一个tuple用class实例表示就可以跟容易看出表的结构了 也就是ORM技术 把关系数据库的表结构映射到对象上
在Python中最有名的ORM框架就是SQLAlchemy
首先通过easy-install或者pip安装SQLAlchemy:
$easy_install sqlalchemy
然后利用mysql中的数据库中的user表 用SQLAlchemy 试一试:
第一步:导入SQLAlchemy 并初始化DBSession
#导入:
from sqlalchemy import Column,String,create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base
#创建对象的基类
Base=declarative_basae()
#定义User对象:
class User(Base):
#表的名字:
__tablename__='user'
#表的结构
id=Column(String(20),primary_key=True)
name=Column(String(20))
#初始化数据库连接
engine=create_engine('mysql+mysqlconnector://root:123456@localhost:3306/pythonstudy')
#创建DBSession
DBSession=sessionmaker(bind=engine)
以上代码完成了SQLAlchemy的初始化和具体的每个表达的class定义 如果有多个表 就继续定义其他的class
create_engine()用来初始化数据库连接 SQLAlchemy 用一个字符串表示连接信息
第二步:有了连接信息 就可以使用ORM对数据库进行操作:
#创建session对象
session=DBSession()
new_user=User(id='5',name='lyd')
#添加到session中
session.add(new_user)
#提交即保存到数据库
session.commit()
#关闭session
session.close()
查询如下:
session=DBSession()
#创建query查询 filter是where条件 最后调用one()是返回唯一一行 如果调用all()则返回所有行
user=session.query(User).filter(User.id=='5').one()
#打印类型和对象的name 属性
print 'type',type(user)
print 'name',user.name
#关闭链接
session.close()
ORM 就是把数据库表的行与相应的对象建立关联互相转换。
如果一个User拥有多个Book 就可以定义一对多关系如下:
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'))
当我们查询一个user对象是 该对象的books属性将返回一个包含若干个book对象的list