使用 SQLite
# 導入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))')
# 繼續執行一條SQL語句,插入一條記錄:
cursor.execute('insert into user (id, name) values (\'1\', \'Michael\')')
# 通過rowcount獲得插入的行數:
cursor.rowcount
# 關閉Cursor:
cursor.close()
# 提交事務:
conn.commit()
# 關閉Connection:
conn.close()
查詢記錄:
conn = sqlite3.connect('test.db')
cursor = conn.cursor()
# 執行查詢語句:
cursor.execute('select * from user where id=?', ('1',))
# 獲得查詢結果集:
values = cursor.fetchall() ==> [('1', 'Michael')]
cursor.close()
conn.close()
使用 Cursor
對象執行 insert
, update
, delete
語句時,執行結果由 rowcount
返回影響的行數,就可以拿到執行結果
使用 Cursor
對象執行 select
語句時,通過 featchall()
可以拿到結果集。結果集是一個 list
,每個元素都是一個 tuple
,對應一行記錄
如果 SQL 語句帶有參數,那么需要把參數按照位置傳遞給 execute()
方法,有幾個 ? 占位符就必須對應幾個參數
cursor.execute('select * from user where name=? and pwd=?', ('abc', 'password'))
使用 MySQL
MySQL 官方提供了 mysql-connector-python 驅動,但是安裝的時候需要給 pip 命令加上參數 --allow-external
:
$ pip install mysql-connector-python --allow-external mysql-connector-python
或者
$ pip install mysql-connector
Note: MySQL 的 SQL 占位符是 %s
# 導入MySQL驅動:
>>> import mysql.connector
# 注意把password設為你的root口令:
>>> conn = mysql.connector.connect(user='root', password='password', database='test')
>>> cursor = conn.cursor()
# 創建user表:
>>> cursor.execute('create table user (id varchar(20) primary key, name varchar(20))')
# 插入一行記錄,注意MySQL的占位符是%s:
>>> cursor.execute('insert into user (id, name) values (%s, %s)', ['1', 'Michael'])
>>> cursor.rowcount
1
# 提交事務:
>>> conn.commit()
>>> cursor.close()
# 運行查詢:
>>> cursor = conn.cursor()
>>> cursor.execute('select * from user where id = %s', ('1',))
>>> values = cursor.fetchall()
>>> values
[('1', 'Michael')]
# 關閉Cursor和Connection:
>>> cursor.close()
True
>>> conn.close()
使用 SQLAlchemy
在 Python 中,最有名的 ORM 框架是 SQLAlchemy
完成SQLAlchemy的初始化和具體每個表的class定義:
# 導入:
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)
插入:
# 創建session對象,DBSession對象 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()
# 打印類型和對象的name屬性:
print('type:', type(user))
print('name:', user.name)
# 關閉Session:
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