首先安裝包
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
engine = create_engine('mysql://root@localhost/study?charset=utf8')
建立映射類須要繼承聲明基類,使用 declarative_base :函數
from sqlalchemy.ext.declarative import declarative_base學習
Base = declarative_base(engine)測試
建立映射類須繼承聲明基類。首先建立 user 數據表的映射類,此表存放用戶數據,也就是課程做者的數據:編碼
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 文件:
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 類
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
from db import Base, engine, User, Course
session = sessionmaker(engine)()
當咱們建立了 session 實例,就啓動了一個操做 MySQL 數據庫的會話。
生成測試數據
接下來建立 5 個課程做者,也就是 5 個 User 類的實例,每一個做者對應兩個課程,共 10 個 Course 類實例。將如下代碼寫入測試數據的 Python 文件中,文件名爲 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
In [2]: create_users()
In [3]: session.query(User).all()
Out[3]:
[<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
In [7]: create_courses()
In [8]: for course in session.query(Course)[:4]:
...: print(course.name)
...:
開發中文電子新聞
怎麼發佈結果詳細
你的只要很是若是
次數經過評論等級
In [9]: user.course
Out[9]: [<Course: 上海這麼國際時候>, <Course: 對於技術兩個大家>]
In [10]: course = session.query(Course)[12]
In [11]: course.user
Out[11]: <User: 盧建平>
In [12]: session.commit()
**接下來咱們在 ipython 中刪除 user 實例,驗證級聯刪除功能是否生效:
In [13]: session.delete(user)
In [14]: session.commit()**