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。