成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

SQLAlchemy

stonezhu / 1570人閱讀

摘要:首先安裝包數(shù)據(jù)庫(kù)的默認(rèn)編碼為,修改數(shù)據(jù)表的默認(rèn)編碼是的一個(gè)基本操作,這是需要預(yù)先掌握的。生成測(cè)試數(shù)據(jù)接下來創(chuàng)建個(gè)課程作者,也就是個(gè)類的實(shí)例,每個(gè)作者對(duì)應(yīng)兩個(gè)課程,共個(gè)類實(shí)例。

首先安裝包
sudo pip3 install sqlalchemy

數(shù)據(jù)庫(kù)的默認(rèn)編碼為 latin1,修改數(shù)據(jù)表的默認(rèn)編碼是 MySQL 的一個(gè)基本操作,這是需要預(yù)先掌握的。不過學(xué)習(xí)本課程時(shí)并不需要這么做,在創(chuàng)建數(shù)據(jù)庫(kù)的同時(shí)添加 CHARACTER SET = UTF8 指定編碼格式即可。我們要?jiǎng)?chuàng)建課程相關(guān)的映射類以及對(duì)應(yīng)的數(shù)據(jù)表,現(xiàn)在先創(chuàng)建所需數(shù)據(jù)庫(kù) study ,編碼格式為 UTF-8 :

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

使用 SQLAlchemy 連接數(shù)據(jù)庫(kù)需要引擎,創(chuàng)建引擎使用 create_engine 方法:

from sqlalchemy import create_engine

參數(shù)字符串說明:數(shù)據(jù)庫(kù)類型+驅(qū)動(dòng)://用戶名:密碼@主機(jī):端口號(hào)/數(shù)據(jù)庫(kù)名字?charset=編碼格式 mysql 自帶驅(qū)動(dòng),密碼未設(shè)定,端口號(hào)可省略

engine = create_engine("mysql://root@localhost/study?charset=utf8")
創(chuàng)建映射類需要繼承聲明基類,使用 declarative_base :

from sqlalchemy.ext.declarative import declarative_base

創(chuàng)建聲明基類時(shí)傳入引擎

Base = declarative_base(engine)

創(chuàng)建映射類須繼承聲明基類。首先創(chuàng)建 user 數(shù)據(jù)表的映射類,此表存放用戶數(shù)據(jù),也就是課程作者的數(shù)據(jù):

Column 定義字段,Integer、String 分別為整數(shù)和字符串?dāng)?shù)據(jù)類型

from sqlalchemy import Column, Integer, String

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

__tablename__ = "user"  # 設(shè)置數(shù)據(jù)表名字,不可省略
id = Column(Integer, primary_key=True)   # 設(shè)置該字段為主鍵
# unique 設(shè)置唯一約束,nullable 設(shè)置非空約束
name = Column(String(64), unique=True, nullable=False)
email = Column(String(64), unique=True)

# 此特殊方法定義實(shí)例的打印樣式
def __repr__(self):
    return "".format(self.name)

一對(duì)多關(guān)系
現(xiàn)在創(chuàng)建第二個(gè)映射類 Course,它對(duì)應(yīng)的數(shù)據(jù)表 course 存放課程數(shù)據(jù)。一個(gè)課程作者可以創(chuàng)建多個(gè)課程,一個(gè)課程對(duì)應(yīng)唯一的課程作者,這種關(guān)系被稱為一對(duì)多或者多對(duì)一關(guān)系,這是最常用的數(shù)據(jù)表關(guān)系類型:

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 設(shè)置外鍵關(guān)聯(lián),第一個(gè)參數(shù)為字符串,user 為數(shù)據(jù)表名,id 為字段名
# 第二個(gè)參數(shù) ondelete 設(shè)置刪除 User 實(shí)例后對(duì)關(guān)聯(lián)的 Course 實(shí)例的處理規(guī)則
# "CASCADE" 表示級(jí)聯(lián)刪除,刪除用戶實(shí)例后,對(duì)應(yīng)的課程實(shí)例也會(huì)被連帶刪除
user_id = Column(Integer, ForeignKey("user.id", ondelete="CASCADE"))
# relationship 設(shè)置查詢接口,以便后期進(jìn)行數(shù)據(jù)庫(kù)查詢操作
# 第一個(gè)參數(shù)為位置參數(shù),參數(shù)值為外鍵關(guān)聯(lián)的映射類名,數(shù)據(jù)類型為字符串
# 第二個(gè)參數(shù) backref 設(shè)置反向查詢接口
# backref 的第一個(gè)參數(shù) "course" 為查詢屬性,User 實(shí)例使用該屬性可以獲得相關(guān)課程實(shí)例的列表
# backref 的第二個(gè)參數(shù) cascade 如此設(shè)置即可實(shí)現(xiàn) Python 語句刪除用戶數(shù)據(jù)時(shí)級(jí)聯(lián)刪除課程數(shù)據(jù)
user = relationship("User", 
        backref=backref("course", cascade="all, delete-orphan"))

def __repr__(self):
    return "".format(self.name)
    
    

創(chuàng)建數(shù)據(jù)表
聲明基類 Base 在創(chuàng)建之后并不會(huì)主動(dòng)連接數(shù)據(jù)庫(kù),因?yàn)樗哪J(rèn)設(shè)置為惰性模式。Base 的 metadata 有個(gè) create_all 方法,執(zhí)行此方法會(huì)主動(dòng)連接數(shù)據(jù)庫(kù)并創(chuàng)建全部數(shù)據(jù)表,完成之后自動(dòng)斷開與數(shù)據(jù)庫(kù)的連接:

Base.metadata.create_all()

完整代碼
總結(jié)以上內(nèi)容,寫入 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 "".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 "".format(self.name)

if name == "__main__":

# 使用聲明基類的 metadata 對(duì)象的 create_all 方法創(chuàng)建數(shù)據(jù)表:
Base.metadata.create_all()

運(yùn)行程序
在終端使用 Python 解釋器運(yùn)行文件,在此之前先安裝一個(gè)必要的依賴包 mysqlclient,該依賴包的作用是連接數(shù)據(jù)庫(kù):

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

測(cè)試數(shù)據(jù)的創(chuàng)建需要用到 Python 的 faker 庫(kù),使用 pip3 安裝先:

sudo pip3 install faker
這是一個(gè)用法簡(jiǎn)單功能強(qiáng)大的偽造數(shù)據(jù)的庫(kù),大家可以在命令行交互解釋器 ipython 中進(jìn)行測(cè)試,首先在終端命令行安裝 ipython :

$ sudo pip3 install ipython

完成后終端執(zhí)行 ipython 命令,即可進(jìn)入命令行交互解釋器:

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

創(chuàng)建實(shí)例,添加參數(shù) "zh-cn" 是為了偽造中文數(shù)據(jù) 該實(shí)例叫做工廠對(duì)象,它可以使用各種各樣的方法偽造數(shù)據(jù)

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]: "[email protected]"

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

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

ession 處理數(shù)據(jù)
上文已經(jīng)介紹了使用映射類創(chuàng)建數(shù)據(jù)表要用聲明基類 Base,那么處理數(shù)據(jù)用什么呢?要用到 session,它是 sessionmaker 類的實(shí)例,該實(shí)例實(shí)現(xiàn)了 call 方法,本身可以作為函數(shù)來執(zhí)行,返回值就是能夠處理數(shù)據(jù)的 session:

from sqlalchemy.orm import sessionmaker

從 db.py 文件中引入下列對(duì)象備用

from db import Base, engine, User, Course

將 engine 引擎作為參數(shù)創(chuàng)建 session 實(shí)例

session = sessionmaker(engine)()
當(dāng)我們創(chuàng)建了 session 實(shí)例,就啟動(dòng)了一個(gè)操作 MySQL 數(shù)據(jù)庫(kù)的會(huì)話。

生成測(cè)試數(shù)據(jù)
接下來創(chuàng)建 5 個(gè)課程作者,也就是 5 個(gè) User 類的實(shí)例,每個(gè)作者對(duì)應(yīng)兩個(gè)課程,共 10 個(gè) Course 類實(shí)例。將以下代碼寫入測(cè)試數(shù)據(jù)的 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):
    # 創(chuàng)建 10 個(gè) User 類實(shí)例,偽造 name 和 email
    user = User(name=fake.name(), email=fake.email())
    # 將實(shí)例添加到 session 會(huì)話中,以備提交到數(shù)據(jù)庫(kù)
    # 注意,此時(shí)的 user 對(duì)象沒有 id 屬性值
    # 映射類的主鍵字段默認(rèn)從 1 開始自增,在傳入 session 時(shí)自動(dòng)添加該屬性值
    session.add(user)

def create_courses():

# session 有個(gè) query 方法用來查詢數(shù)據(jù),參數(shù)為映射類的類名
# all 方法表示查詢?nèi)?,這里也可以省略不寫
# user 就是上一個(gè)函數(shù) create_users 中的 user 對(duì)象
for user in session.query(User).all():
    # 兩次循環(huán),對(duì)每個(gè)作者創(chuàng)建兩個(gè)課程
    for i in range(2):
        # 創(chuàng)建課程實(shí)例,name 的值為 8 個(gè)隨機(jī)漢字
        course = Course(name="".join(fake.words(4)), user_id=user.id)
        session.add(course)

def main():

# 執(zhí)行兩個(gè)創(chuàng)建實(shí)例的函數(shù),session 會(huì)話內(nèi)就有了這些實(shí)例
create_users()
create_courses()
# 執(zhí)行 session 的 commit 方法將全部數(shù)據(jù)提交到對(duì)應(yīng)的數(shù)據(jù)表中
session.commit()

if name == "__main__":

main()

完成后,可以在終端執(zhí)行 python3 create_data.py 來創(chuàng)建數(shù)據(jù)。為了便于查看代碼的執(zhí)行情況,不這樣做,我們?cè)?ipython 中引入這些函數(shù),依次執(zhí)行它們來查看細(xì)節(jié):

引入相關(guān)對(duì)象

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

執(zhí)行創(chuàng)建 User 實(shí)例的函數(shù)

In [2]: create_users()

session 查詢結(jié)果為列表,每個(gè)元素就是一個(gè) User 實(shí)例

In [3]: session.query(User).all()
Out[3]:
[,
,
,
,
,
,
,
,
,
]

將某個(gè) User 實(shí)例賦值給 user 變量

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

查看屬性

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

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

執(zhí)行創(chuàng)建 Course 實(shí)例的函數(shù)

In [7]: create_courses()

查看前 4 個(gè) Course 實(shí)例的 name 屬性

In [8]: for course in session.query(Course)[:4]:
...: print(course.name)
...:
開發(fā)中文電子新聞
怎么發(fā)布結(jié)果詳細(xì)
你的只要非常如果
次數(shù)通過評(píng)論等級(jí)

User 實(shí)例的 course 屬性為查詢接口,通過 relationship 設(shè)置 屬性值為列表,里面是兩個(gè)課程實(shí)例

In [9]: user.course
Out[9]: [, ]

將某個(gè)課程實(shí)例賦值給 course 變量

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

課程實(shí)例的 user 屬性為查詢接口,通過 relationship 設(shè)置

In [11]: course.user
Out[11]:

將全部實(shí)例提交到對(duì)應(yīng)的數(shù)據(jù)表

In [12]: session.commit()

**接下來我們?cè)?ipython 中刪除 user 實(shí)例,驗(yàn)證級(jí)聯(lián)刪除功能是否生效:

In [13]: session.delete(user)

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

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/44006.html

相關(guān)文章

  • 通過demo學(xué)習(xí)OpenStack開發(fā)所需的基礎(chǔ)知識(shí) -- 數(shù)據(jù)庫(kù)(1)

    摘要:另外,項(xiàng)目在單元測(cè)試中使用的是的內(nèi)存數(shù)據(jù)庫(kù),這樣開發(fā)者運(yùn)行單元測(cè)試的時(shí)候不需要安裝和配置復(fù)雜的數(shù)據(jù)庫(kù),只要安裝好就可以了。而且,數(shù)據(jù)庫(kù)是保存在內(nèi)存中的,會(huì)提高單元測(cè)試的速度。是實(shí)現(xiàn)層的基礎(chǔ)。項(xiàng)目一般會(huì)使用數(shù)據(jù)庫(kù)來運(yùn)行單元測(cè)試。 OpenStack中的關(guān)系型數(shù)據(jù)庫(kù)應(yīng)用 OpenStack中的數(shù)據(jù)庫(kù)應(yīng)用主要是關(guān)系型數(shù)據(jù)庫(kù),主要使用的是MySQL數(shù)據(jù)庫(kù)。當(dāng)然也有一些NoSQL的應(yīng)用,比如Ce...

    warnerwu 評(píng)論0 收藏0
  • 深入理解flask框架(3):config與extension

    摘要:中的配置,都是通過來控制那么究竟是什么再來看函數(shù)而是什么再轉(zhuǎn)向看的源碼,可以看到類繼承于字典也就是說的就是一個(gè)特殊的字典,用于保存配置項(xiàng)。 config flask中的配置,都是通過config來控制那么config究竟是什么? self.config = self.make_config(instance_relative_config) 再來看make_config函數(shù): def ...

    wmui 評(píng)論0 收藏0
  • Flask-SQLAlchemy 學(xué)習(xí)總結(jié)

    摘要:初始化和配置對(duì)象關(guān)系映射。的則需要在中聲明。例如配置信息中指出是可以綁定多個(gè)數(shù)據(jù)庫(kù)引擎。是通過解決一對(duì)多的關(guān)系。將會(huì)返回學(xué)院學(xué)生人數(shù)將會(huì)返回學(xué)生的學(xué)院信息的類實(shí)例。處理關(guān)系對(duì)象查詢中有詳細(xì)的說明。 初始化和配置 ORM(Object Relational Mapper) 對(duì)象關(guān)系映射。指將面對(duì)對(duì)象得方法映射到數(shù)據(jù)庫(kù)中的關(guān)系對(duì)象中。Flask-SQLAlchemy是一個(gè)Flask擴(kuò)展,能...

    whataa 評(píng)論0 收藏0
  • flask筆記:是flask.ext.sqlalchemy還是flask_sqlalchemy

    摘要:首先出結(jié)論,和是一個(gè)意思,區(qū)別是寫法不同,兼容性不同。是特有的拓展功能,目前,擴(kuò)展必須支持以及原因擴(kuò)展導(dǎo)入轉(zhuǎn)換我們推薦使用擴(kuò)展的命名空間包。相反,我們現(xiàn)在推薦命名軟件包,而不是現(xiàn)在已棄用的。 最近入門python的flask框架,官方推薦用sqlalchemy庫(kù)作為與數(shù)據(jù)庫(kù)交互的工具。這時(shí)我在看網(wǎng)絡(luò)上一些文章資料時(shí)發(fā)現(xiàn)一個(gè)問題。 這里插個(gè)題外話,sqlalchemy和flask_sql...

    DandJ 評(píng)論0 收藏0
  • Python-SQLAlchemy:第1節(jié):SQLAlchemy入門

    摘要:下一篇文章第節(jié)查詢條件設(shè)置是編程語言下的一款開源軟件。提供了工具包及對(duì)象關(guān)系映射工具,使用許可證發(fā)行。在關(guān)閉連接時(shí)會(huì)自動(dòng)進(jìn)行事務(wù)提交操作。引入多條件查詢時(shí)使用。由于上下文函數(shù)退出時(shí)會(huì)自動(dòng)提交事務(wù),所以無需顯示的調(diào)用使新增生效。 下一篇文章:Python-SQLAlchemy:第2節(jié):查詢條件設(shè)置 SQLAlchemy是Python編程語言下的一款開源軟件。提供了SQL工具包及對(duì)象關(guān)系...

    noONE 評(píng)論0 收藏0
  • Flask擴(kuò)展之flask-sqlalchemy(上)

    摘要:查詢記錄在調(diào)試或測(cè)試模式自動(dòng)啟用??梢杂糜陲@式禁用原生支持。當(dāng)使用不合適的指定無編碼的數(shù)據(jù)庫(kù)默認(rèn)值時(shí),這對(duì)于一些數(shù)據(jù)庫(kù)適配器是必須的比如上某些版本的。這對(duì)是必要的,它默認(rèn)移除閑置多于小時(shí)的連接。注意如果使用了,自動(dòng)設(shè)定這個(gè)值為小時(shí)。 flask-sqlalchemy是flask的一個(gè)ORM擴(kuò)展框架,這個(gè)擴(kuò)展在sqlalchemy的進(jìn)行的擴(kuò)展,更方便的結(jié)合Flask.什么是ORM?其是O...

    KaltZK 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<