一:SQLite
1.1.Sqlite數據庫簡介
SQLite是一個嵌入式的數據庫,他的數據庫是個文件。
SQLite本身是c語音寫的,所以經常被集成到各種應用程序。
python就內置了SQLite,所以python使用SQLite不需要安裝任何東西,直接進行使用。
連接到數據庫后需要打開游標,稱之為Cursor,通過Cursor執行sql預計和執行后的結果。
1.2使用SQLite數據庫
python中內置的與mysql交互的方法如下:
#導入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對象都正確地被關閉,否則,資源就會泄露。
如何才能確保出錯的情況下也關閉掉Connection對象和Cursor對象呢?請回憶try:...except:...finally:...的用法。
二:MySql
2.1.python中連接MySql
#導入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表。
[
('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。
3.1.使用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。
