一:SQLite
1.1.Sqlite数据库简介
SQLite是一个嵌入式的数据库,他的数据库是个文件。
SQLite本身是c语音写的,所以经常被集成到各种应用程序。
python就内置了SQLite,所以python使用SQLite不需要安装任何东西,直接进行使用。
连接到数据库后需要打开游标,称之为Cursor,通过Cursor执行sql预计和执行后的结果。
1.2使用SQLite数据库
python中内置的与mysql交互的方法如下:
代码语言:javascript复制#导入SQLit3
import sqlite3
#连接sqlite3数据库,数据库文件是test.db,如果文件不存在会自动在当前目录中创建
conn = sqlite3.connect('test.db')
#创建一个Cursor
cursor = conn.cursor()
#创建一个user表
cursor.execute('create table user (id varchar(20) primary key, name varchar(20) )')
#插入一条记录
cursor.execute(inser into user(id , name) values('1', 'yaohong' ))
#获取插入的条数
print cursor.rowcount
#关闭cursor
cursor.close()
#提交事务
cursor.commit()
#关闭conn
conn.close()
查询结果
代码语言:javascript复制conn = sqlite3.connect('test.db')
cursor = conn.cursor()
#查询
cursor.executr('select * from user where id=?', ('1',))
#获得查询结果
values = cursor.fetchall()
print values
cursor.close()
conn.close()
查询获取的结果都是一个list,每个元素都是一个tuple。
要确保打开的Connection对象和Cursor对象都正确地被关闭,否则,资源就会泄露。
如何才能确保出错的情况下也关闭掉Connection对象和Cursor对象呢?请回忆try:...except:...finally:...
的用法。
二:MySql
2.1.python中连接MySql
代码语言:javascript复制#导入mysql驱动
import mysql.connector
#连接mysql
conn = mysql.connector.connect(user='root', password='password', database='test', use_unicode=True)
#连接cursor
cursor = conn.cursor()
#创建usr表
cursor.exect('create table user (id varchar(20) primary key, name varchar(20))')
cursor.execute('insert into user (id, name) values (%s, %s)', ['1', 'Michael'])
#提交事务
cursor.commit()
cursor.close()
#运行查询
cursor = conn.cursor()
cursor.execute('select * from user where id = %s', ('1',))
values = cursor.fetchall()
cursor.close()
conn.close()
三:SQLAlchemy
3.2.ORM
数据库是个二维表,包含对行多列。把一个表用python的数据结构来表示的话,可以用一个list表示多行,list的每行是个tuple。如下用id和name的user表。
代码语言:javascript复制[
('1', 'Michael'),
('2', 'Bob'),
('3', 'Adam')
]
如果用tuple很难看出表的结构,如果把一个tuple用一个class来表示,就可以更容易的看出表结构。
代码语言:javascript复制class User(object):
def __init__(self, id, name):
self.id = id
self.name = name
[
User('1', 'jack'),
User('2', 'yaohong')
]
以上就是ORM(对象关系)映射
在Python中,最有名的ORM框架是SQLAlchemy。
3.1.使用SQLAlchemy
代码语言:javascript复制# 导入:
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)
如果有多个表,则再定义一个class
代码语言:javascript复制class School(Base):
__tablename__ = 'school'
id = ...
name = ...
添加数据
代码语言:javascript复制# 创建session对象:
session = DBSession()
# 创建User对象
new_user = User(id='5', name='Bob')
#添加到session
session.add(new_user)
#提交即保存到数据库:
session.commit()
# 关闭session:
session.close()
查询数据
代码语言:javascript复制#session
session = DBSession()
#创建Query查询,filter是where条件,最后调用one()返回唯一行,如果调用all()则返回所有行:
user = session.query(User).filter(User.id=='5').one()
#关闭session
session.close()
一对多关系
代码语言:javascript复制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。