SQLite是一个嵌入式的数据库,他的数据库是个文件。python
SQLite自己是c语音写的,因此常常被集成到各类应用程序。mysql
python就内置了SQLite,因此python使用SQLite不须要安装任何东西,直接进行使用。sql
链接到数据库后须要打开游标,称之为Cursor,经过Cursor执行sql预计和执行后的结果。数据库
python中内置的与mysql交互的方法以下:session
#导入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()
查询结果数据结构
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对象都正确地被关闭,不然,资源就会泄露。fetch
如何才能确保出错的状况下也关闭掉Connection对象和Cursor对象呢?请回忆try:...except:...finally:...
的用法。code
#导入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()
数据库是个二维表,包含对行多列。把一个表用python的数据结构来表示的话,能够用一个list表示多行,list的每行是个tuple。以下用id和name的user表。orm
[ ('1', 'Michael'), ('2', 'Bob'), ('3', 'Adam') ]
若是用tuple很难看出表的结构,若是把一个tuple用一个class来表示,就能够更容易的看出表结构。
class User(object): def __init__(self, id, name): self.id = id self.name = name [ User('1', 'jack'), User('2', 'yaohong') ]
以上就是ORM(对象关系)映射
在Python中,最有名的ORM框架是SQLAlchemy。
# 导入: 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
class School(Base): __tablename__ = 'school' id = ... name = ...
添加数据
# 建立session对象: session = DBSession() # 建立User对象 new_user = User(id='5', name='Bob') #添加到session session.add(new_user) #提交即保存到数据库: session.commit() # 关闭session: session.close()
查询数据
#session session = DBSession() #建立Query查询,filter是where条件,最后调用one()返回惟一行,若是调用all()则返回全部行: user = session.query(User).filter(User.id=='5').one() #关闭session session.close()
一对多关系
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。