SQLAlchemy

首先安裝包
sudo pip3 install sqlalchemypython

數據庫的默認編碼爲 latin1,修改數據表的默認編碼是 MySQL 的一個基本操做,這是須要預先掌握的。不過學習本課程時並不須要這麼作,在建立數據庫的同時添加 CHARACTER SET = UTF8 指定編碼格式便可。咱們要建立課程相關的映射類以及對應的數據表,如今先建立所需數據庫 study ,編碼格式爲 UTF-8 :mysql

mysql -u root
create database study character set = UTF8;
show create database studyGsql

使用 SQLAlchemy 鏈接數據庫須要引擎,建立引擎使用 create_engine 方法:數據庫

from sqlalchemy import create_enginesession

參數字符串說明:數據庫類型+驅動://用戶名:密碼@主機:端口號/數據庫名字?charset=編碼格式

mysql 自帶驅動,密碼未設定,端口號可省略

engine = create_engine('mysql://root@localhost/study?charset=utf8')
建立映射類須要繼承聲明基類,使用 declarative_base :函數

from sqlalchemy.ext.declarative import declarative_base學習

建立聲明基類時傳入引擎

Base = declarative_base(engine)測試

建立映射類須繼承聲明基類。首先建立 user 數據表的映射類,此表存放用戶數據,也就是課程做者的數據:編碼

Column 定義字段,Integer、String 分別爲整數和字符串數據類型

from sqlalchemy import Column, Integer, Stringurl

class User(Base): # 繼承聲明基類

__tablename__ = 'user'  # 設置數據表名字,不可省略
id = Column(Integer, primary_key=True)   # 設置該字段爲主鍵
# unique 設置惟一約束,nullable 設置非空約束
name = Column(String(64), unique=True, nullable=False)
email = Column(String(64), unique=True)

# 此特殊方法定義實例的打印樣式
def __repr__(self):
    return '<User: {}>'.format(self.name)

一對多關係
如今建立第二個映射類 Course,它對應的數據表 course 存放課程數據。一個課程做者能夠建立多個課程,一個課程對應惟一的課程做者,這種關係被稱爲一對多或者多對一關係,這是最經常使用的數據表關係類型:

from sqlalchemy import ForeignKey
from sqlalchemy.orm import relationship, backref

class Course(Base):

__tablename__ = 'course'
id = Column(Integer, primary_key=True)
name = Column(String(64))
# ForeignKey 設置外鍵關聯,第一個參數爲字符串,user 爲數據表名,id 爲字段名
# 第二個參數 ondelete 設置刪除 User 實例後對關聯的 Course 實例的處理規則
# 'CASCADE' 表示級聯刪除,刪除用戶實例後,對應的課程實例也會被連帶刪除
user_id = Column(Integer, ForeignKey('user.id', ondelete='CASCADE'))
# relationship 設置查詢接口,以便後期進行數據庫查詢操做
# 第一個參數爲位置參數,參數值爲外鍵關聯的映射類名,數據類型爲字符串
# 第二個參數 backref 設置反向查詢接口
# backref 的第一個參數 'course' 爲查詢屬性,User 實例使用該屬性能夠得到相關課程實例的列表
# backref 的第二個參數 cascade 如此設置便可實現 Python 語句刪除用戶數據時級聯刪除課程數據
user = relationship('User', 
        backref=backref('course', cascade='all, delete-orphan'))

def __repr__(self):
    return '<Course: {}>'.format(self.name)

建立數據表
聲明基類 Base 在建立以後並不會主動鏈接數據庫,由於它的默認設置爲惰性模式。Base 的 metadata 有個 create_all 方法,執行此方法會主動鏈接數據庫並建立所有數據表,完成以後自動斷開與數據庫的鏈接:

Base.metadata.create_all()

完整代碼
總結以上內容,寫入 db.py 文件:

File Name:db.py

from sqlalchemy import create_engine, Column, Integer, String, ForeignKey
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relationship, backref

engine = create_engine('mysql://root@localhost/study?charset=utf8')
Base = declarative_base(engine)

class User(Base):

__tablename__ = 'user'  
id = Column(Integer, primary_key=True) 
name = Column(String(64), unique=True, nullable=False)
email = Column(String(64), unique=True)

def __repr__(self):
    return '<User: {}>'.format(self.name)

class Course(Base):

__tablename__ = 'course'
id = Column(Integer, primary_key=True)
name = Column(String(64))
user_id = Column(Integer, ForeignKey('user.id', ondelete='CASCADE'))
user = relationship('User',
        backref=backref('course', cascade='all, delete-orphan'))

def __repr__(self):
    return '<Course: {}>'.format(self.name)

if name == '__main__':

# 使用聲明基類的 metadata 對象的 create_all 方法建立數據表:
Base.metadata.create_all()

運行程序
在終端使用 Python 解釋器運行文件,在此以前先安裝一個必要的依賴包 mysqlclient,該依賴包的做用是鏈接數據庫:

$ sudo pip3 install mysqlclient # 安裝依賴包
$ python3 db.py

測試數據的建立須要用到 Python 的 faker 庫,使用 pip3 安裝先:

sudo pip3 install faker
這是一個用法簡單功能強大的僞造數據的庫,你們能夠在命令行交互解釋器 ipython 中進行測試,首先在終端命令行安裝 ipython :

$ sudo pip3 install ipython

完成後終端執行 ipython 命令,便可進入命令行交互解釋器:

In [38]: from faker import Faker # 引入 Faker 類

建立實例,添加參數 'zh-cn' 是爲了僞造中文數據

該實例叫作工廠對象,它可使用各類各樣的方法僞造數據

In [39]: fake = Faker('zh-cn')

In [40]: fake.name() # 僞造姓名
Out[40]: '房明'

In [41]: fake.address() # 僞造地址
Out[41]: '山西省梅市上街董路Q座 238175'

In [42]: fake.email() # 僞造郵箱
Out[42]: 'oqiu@rn.net'

In [43]: fake.url() # 僞造 URL
Out[43]: 'https://www.yuzhu.cn/'

In [44]: fake.date() # 僞造日期
Out[44]: '2012-07-03'

ession 處理數據
上文已經介紹了使用映射類建立數據表要用聲明基類 Base,那麼處理數據用什麼呢?要用到 session,它是 sessionmaker 類的實例,該實例實現了 call 方法,自己能夠做爲函數來執行,返回值就是可以處理數據的 session:

from sqlalchemy.orm import sessionmaker

從 db.py 文件中引入下列對象備用

from db import Base, engine, User, Course

將 engine 引擎做爲參數建立 session 實例

session = sessionmaker(engine)()
當咱們建立了 session 實例,就啓動了一個操做 MySQL 數據庫的會話。

生成測試數據
接下來建立 5 個課程做者,也就是 5 個 User 類的實例,每一個做者對應兩個課程,共 10 個 Course 類實例。將如下代碼寫入測試數據的 Python 文件中,文件名爲 create_data.py :

File Name: create_data.py

from sqlalchemy.orm import sessionmaker
from faker import Faker
from db import Base, engine, User, Course

session = sessionmaker(engine)()
fake = Faker('zh-cn')

def create_users():

for i in range(10):
    # 建立 10 個 User 類實例,僞造 name 和 email
    user = User(name=fake.name(), email=fake.email())
    # 將實例添加到 session 會話中,以備提交到數據庫
    # 注意,此時的 user 對象沒有 id 屬性值
    # 映射類的主鍵字段默認從 1 開始自增,在傳入 session 時自動添加該屬性值
    session.add(user)

def create_courses():

# session 有個 query 方法用來查詢數據,參數爲映射類的類名
# all 方法表示查詢所有,這裏也能夠省略不寫
# user 就是上一個函數 create_users 中的 user 對象
for user in session.query(User).all():
    # 兩次循環,對每一個做者建立兩個課程
    for i in range(2):
        # 建立課程實例,name 的值爲 8 個隨機漢字
        course = Course(name=''.join(fake.words(4)), user_id=user.id)
        session.add(course)

def main():

# 執行兩個建立實例的函數,session 會話內就有了這些實例
create_users()
create_courses()
# 執行 session 的 commit 方法將所有數據提交到對應的數據表中
session.commit()

if name == '__main__':

main()

完成後,能夠在終端執行 python3 create_data.py 來建立數據。爲了便於查看代碼的執行狀況,不這樣作,咱們在 ipython 中引入這些函數,依次執行它們來查看細節:

引入相關對象

In [1]: from create_data import User, Course, session, create_users, create_courses

執行建立 User 實例的函數

In [2]: create_users()

session 查詢結果爲列表,每一個元素就是一個 User 實例

In [3]: session.query(User).all()
Out[3]:
[<User: 安穎>,
<User: 趙琴>,
<User: 李英>,
<User: 邢想>,
<User: 高玲>,
<User: 戴晶>,
<User: 盧建平>,
<User: 陳強>,
<User: 姜帆>,
<User: 包柳>]

將某個 User 實例賦值給 user 變量

In [4]: user = session.query(User).all()[3]

查看屬性

In [5]: user.name
Out[5]: '邢想'

In [6]: user.id
Out[6]: 4

執行建立 Course 實例的函數

In [7]: create_courses()

查看前 4 個 Course 實例的 name 屬性

In [8]: for course in session.query(Course)[:4]:
...: print(course.name)
...:
開發中文電子新聞
怎麼發佈結果詳細
你的只要很是若是
次數經過評論等級

User 實例的 course 屬性爲查詢接口,經過 relationship 設置

屬性值爲列表,裏面是兩個課程實例

In [9]: user.course
Out[9]: [<Course: 上海這麼國際時候>, <Course: 對於技術兩個大家>]

將某個課程實例賦值給 course 變量

In [10]: course = session.query(Course)[12]

課程實例的 user 屬性爲查詢接口,經過 relationship 設置

In [11]: course.user
Out[11]: <User: 盧建平>

將所有實例提交到對應的數據表

In [12]: session.commit()

**接下來咱們在 ipython 中刪除 user 實例,驗證級聯刪除功能是否生效:

In [13]: session.delete(user)

In [14]: session.commit()**

相關文章
相關標籤/搜索