最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python SQLAlchemy入門(mén)教程(基本用法)

 更新時(shí)間:2019年11月11日 08:29:32   作者:Yabea  
這篇文章主要介紹了Python SQLAlchemy入門(mén)教程,本文通過(guò)實(shí)例主要給大家講解了python SQLAlchemy基本用法,需要的朋友可以參考下

本文將以Mysql舉例,介紹sqlalchemy的基本用法。其中,Python版本為2.7,sqlalchemy版本為1.1.6。

一. 介紹

SQLAlchemy是Python中最有名的ORM工具。

關(guān)于ORM:

全稱Object Relational Mapping(對(duì)象關(guān)系映射)。

特點(diǎn)是操縱Python對(duì)象而不是SQL查詢,也就是在代碼層面考慮的是對(duì)象,而不是SQL,體現(xiàn)的是一種程序化思維,這樣使得Python程序更加簡(jiǎn)潔易讀。

具體的實(shí)現(xiàn)方式是將數(shù)據(jù)庫(kù)表轉(zhuǎn)換為Python類(lèi),其中數(shù)據(jù)列作為屬性,數(shù)據(jù)庫(kù)操作作為方法。

優(yōu)點(diǎn):

  • 簡(jiǎn)潔易讀:將數(shù)據(jù)表抽象為對(duì)象(數(shù)據(jù)模型),更直觀易讀
  • 可移植:封裝了多種數(shù)據(jù)庫(kù)引擎,面對(duì)多個(gè)數(shù)據(jù)庫(kù),操作基本一致,代碼易維護(hù)
  • 更安全:有效避免SQL注入

為什么要用sqlalchemy?

雖然性能稍稍不及原生SQL,但是操作數(shù)據(jù)庫(kù)真的很方便!

二. 使用

概念和數(shù)據(jù)類(lèi)型

概念

概念 對(duì)應(yīng)數(shù)據(jù)庫(kù) 說(shuō)明
Engine 連接 驅(qū)動(dòng)引擎
Session 連接池,事務(wù) 由此開(kāi)始查詢
Model 類(lèi)定義
Column
Query 若干行 可以鏈?zhǔn)教砑佣鄠€(gè)條件

常見(jiàn)數(shù)據(jù)類(lèi)型

數(shù)據(jù)類(lèi)型 數(shù)據(jù)庫(kù)數(shù)據(jù)類(lèi)型 python數(shù)據(jù)類(lèi)型 說(shuō)明
Integer int int 整形,32位
String varchar string 字符串
Text text string 長(zhǎng)字符串
Float float float 浮點(diǎn)型
Boolean tinyint bool True / False
Date date datetime.date 存儲(chǔ)時(shí)間年月日
DateTime datetime datetime.datetime 存儲(chǔ)年月日時(shí)分秒毫秒等
Time time datetime.datetime 存儲(chǔ)時(shí)分秒

創(chuàng)建數(shù)據(jù)庫(kù)表

1.安裝

pip install SQLalchemy

2. 創(chuàng)建連接

from sqlalchemy import create_engine

engine = create_engine("mysql://user:password@hostname/dbname?charset=uft8")

這行代碼初始化創(chuàng)建了Engine,Engine內(nèi)部維護(hù)了一個(gè)Pool(連接池)和Dialect(方言),方言來(lái)識(shí)別具體連接數(shù)據(jù)庫(kù)種類(lèi)。

創(chuàng)建好了Engine的同時(shí),Pool和Dialect也已經(jīng)創(chuàng)建好了,但是此時(shí)并沒(méi)有真正與數(shù)據(jù)庫(kù)連接,等到執(zhí)行具體的語(yǔ)句.connect()等時(shí)才會(huì)連接到數(shù)據(jù)庫(kù)。

create_engine還有其它可選的參數(shù),比如:

engine = create_engine("mysql://user:password@hostname/dbname?charset=uft8",
            echo=True,
            pool_size=8,
            pool_recycle=60*30
            )
  • echo: 當(dāng)設(shè)置為T(mén)rue時(shí)會(huì)將orm語(yǔ)句轉(zhuǎn)化為sql語(yǔ)句打印,一般debug的時(shí)候可用
  • pool_size: 連接池的大小,默認(rèn)為5個(gè),設(shè)置為0時(shí)表示連接無(wú)限制
  • pool_recycle: 設(shè)置時(shí)間以限制數(shù)據(jù)庫(kù)多久沒(méi)連接自動(dòng)斷開(kāi)

3. 創(chuàng)建數(shù)據(jù)庫(kù)表類(lèi)(模型)

前面有提到ORM的重要特點(diǎn),那么我們操作表的時(shí)候就需要通過(guò)操作對(duì)象來(lái)實(shí)現(xiàn),現(xiàn)在我們來(lái)創(chuàng)建一個(gè)類(lèi),以常見(jiàn)的用戶表舉例:

from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
class Users(Base):
  __tablename__ = "users"

  id = Column(Integer, primary_key=True)
  name = Column(String(64), unique=True)
  email = Column(String(64))
  def __init__(self, name, email):
    self.name = name
    self.email = email 

declarative_base()是sqlalchemy內(nèi)部封裝的一個(gè)方法,通過(guò)其構(gòu)造一個(gè)基類(lèi),這個(gè)基類(lèi)和它的子類(lèi),可以將Python類(lèi)和數(shù)據(jù)庫(kù)表關(guān)聯(lián)映射起來(lái)。

數(shù)據(jù)庫(kù)表模型類(lèi)通過(guò)__tablename__和表關(guān)聯(lián)起來(lái),Column表示數(shù)據(jù)表的列。

4. 生成數(shù)據(jù)庫(kù)表

Base.metadata.create_all(engine)

創(chuàng)建表,如果存在則忽略,執(zhí)行以上代碼,就會(huì)發(fā)現(xiàn)在db中創(chuàng)建了users表。

操作數(shù)據(jù)

表創(chuàng)建好了就是操作數(shù)據(jù)了,常見(jiàn)的操作增刪改查,我們一一介紹。

session

sqlalchemy中使用session用于創(chuàng)建程序和數(shù)據(jù)庫(kù)之間的會(huì)話,所有對(duì)象的載入和保存都需要通過(guò)session對(duì)象 。

通過(guò)sessionmaker調(diào)用創(chuàng)建一個(gè)工廠,并關(guān)聯(lián)Engine以確保每個(gè)session都可以使用該Engine連接資源:

from sqlalchemy.orm import sessionmaker

# 創(chuàng)建session
DbSession = sessionmaker(bind=engine)
session = DbSession()

session的常見(jiàn)操作方法包括:

  • flush:預(yù)提交,提交到數(shù)據(jù)庫(kù)文件,還未寫(xiě)入數(shù)據(jù)庫(kù)文件中
  • commit:提交了一個(gè)事務(wù)
  • rollback:回滾
  • close:關(guān)閉

舉個(gè)最簡(jiǎn)單的例子:

add_user = Users("test", "test123@qq.com")
session.add(add_user)
session.commit()

session.add()將會(huì)把Model加入當(dāng)前session維護(hù)的持久空間(可以從session.dirty看到)中,直到commit時(shí)提交到數(shù)據(jù)庫(kù)。

Q1:add之后如何直接返回對(duì)象的屬性?

可以在add之后執(zhí)行db.session.flush(),這樣便可在session中g(shù)et到對(duì)象的屬性。

Q2:如何進(jìn)行批量插入,性能比較?

批量插入共有以下幾種方法,對(duì)它們的批量做了比較,分別是:

session.add_all() < bulk_save_object() < bulk_insert_mappings() < SQLAlchemy_core()

查詢是最常用的一個(gè)操作了,舉個(gè)最簡(jiǎn)單的查詢例子:

users = session.query(Users).filter_by(id=1).all()
for item in users:
  print(item.name)

通常我們通過(guò)以上查詢模式獲取數(shù)據(jù),需要注意的是,通過(guò)session.query()我們查詢返回了一個(gè)Query對(duì)象,此時(shí)還沒(méi)有去具體的數(shù)據(jù)庫(kù)中查詢,只有當(dāng)執(zhí)行具體的.all(),.first()等函數(shù)時(shí)才會(huì)真的去操作數(shù)據(jù)庫(kù)。

其中,query有filter和filter_by兩個(gè)過(guò)濾方法,上述例子也可寫(xiě)為:

users = session.query(Users).filter_by(Users.id == 1).all()

通常這兩個(gè)方法都會(huì)用到的,所以一定要掌握它們的區(qū)別:

filter filter_by支持所有比較運(yùn)算符,相等比較用比較用==只能使用"=","!="和"><"過(guò)濾用類(lèi)名.屬性名過(guò)濾用屬性名不支持組合查詢,只能連續(xù)調(diào)用filter變相實(shí)現(xiàn)參數(shù)是**kwargs,支持組合查詢支持and,or和in等

更新數(shù)據(jù)有兩種方法,一種是使用query中的update方法:

filter filter_by
支持所有比較運(yùn)算符,相等比較用比較用== 只能使用"=","!="和"><"
過(guò)濾用類(lèi)名.屬性名 過(guò)濾用屬性名
不支持組合查詢,只能連續(xù)調(diào)用filter變相實(shí)現(xiàn) 參數(shù)是**kwargs,支持組合查詢
支持and,or和in等

更新數(shù)據(jù)有兩種方法,一種是使用query中的update方法:

session.query(Users).filter_by(id=1).update({'name': "Jack"})

另一種是操作對(duì)應(yīng)的表模型:

users = session.query(Users).filter_by(name="Jack").first()
users.name = "test"
session.add(users)

這兩種方式呢,一般批量更新的話我會(huì)選前者,而要對(duì)查詢獲取對(duì)象屬性之后再更新的場(chǎng)景就需要使用后者。

和更新數(shù)據(jù)類(lèi)似,刪除數(shù)據(jù)也有兩種方法,第一種:

delete_users = session.query(Users).filter(Users.name == "test").first()
if delete_users:
  session.delete(delete_users)
  session.commit()

第二種:

session.query(Users).filter(Users.name == "test").delete()
session.commit()

批量刪除時(shí)推薦使用第二種。

以上,就是Python sqlalchemy的基本用法。

代碼可參照:my github

總結(jié)

以上所述是小編給大家介紹的Python SQLAlchemy入門(mén)教程,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
如果你覺(jué)得本文對(duì)你有幫助,歡迎轉(zhuǎn)載,煩請(qǐng)注明出處,謝謝!

相關(guān)文章

  • Python灰度變換中灰度切割分析實(shí)現(xiàn)

    Python灰度變換中灰度切割分析實(shí)現(xiàn)

    灰度變換是指根據(jù)某種目標(biāo)條件按一定變換關(guān)系逐點(diǎn)改變?cè)磮D像中每個(gè)像素灰度值的方法。目的是改善畫(huà)質(zhì),使圖像顯示效果更加清晰。圖像的灰度變換處理是圖像增強(qiáng)處理技術(shù)中的一種非?;A(chǔ)、直接的空間域圖像處理方法,也是圖像數(shù)字化軟件和圖像顯示軟件的一個(gè)重要組成部分
    2022-10-10
  • Python使用面向?qū)ο蠓绞絼?chuàng)建線程實(shí)現(xiàn)12306售票系統(tǒng)

    Python使用面向?qū)ο蠓绞絼?chuàng)建線程實(shí)現(xiàn)12306售票系統(tǒng)

    目前python 提供了幾種多線程實(shí)現(xiàn)方式 thread,threading,multithreading ,其中thread模塊比較底層,而threading模塊是對(duì)thread做了一些包裝,可以更加方便的被使用
    2015-12-12
  • Python中的time模塊和calendar模塊

    Python中的time模塊和calendar模塊

    這篇文章主要介紹了Python中的time模塊和calendar模塊,在Python中對(duì)時(shí)間和日期的處理方式有很多,其中轉(zhuǎn)換日期是最常見(jiàn)的一個(gè)功能。Python中的時(shí)間間隔是以秒為單位的浮點(diǎn)小數(shù)。下面來(lái)看看文章具體內(nèi)容的介紹,需要的朋友可以參考一下,希望對(duì)你有所幫助
    2021-11-11
  • 零基礎(chǔ)寫(xiě)python爬蟲(chóng)之urllib2使用指南

    零基礎(chǔ)寫(xiě)python爬蟲(chóng)之urllib2使用指南

    urllib2是Python的一個(gè)獲取URLs(Uniform Resource Locators)的組件。他以u(píng)rlopen函數(shù)的形式提供了一個(gè)非常簡(jiǎn)單的接口,下面我們用實(shí)例講解他的使用方法
    2014-11-11
  • Python實(shí)現(xiàn)合并帶有嵌入圖片的單元格

    Python實(shí)現(xiàn)合并帶有嵌入圖片的單元格

    這篇文章主要為大家詳細(xì)介紹了如何使用Python實(shí)現(xiàn)合并帶有嵌入圖片的單元格,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-12-12
  • python中multiprosessing模塊的Pool類(lèi)中的apply函數(shù)和apply_async函數(shù)的區(qū)別

    python中multiprosessing模塊的Pool類(lèi)中的apply函數(shù)和apply_async函數(shù)的區(qū)別

    這篇文章主要介紹了python中multiprosessing模塊的Pool類(lèi)中的apply函數(shù)和apply_async函數(shù)的區(qū)別、文章圍繞主題的相關(guān)內(nèi)容展開(kāi)詳細(xì)介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-06-06
  • Python方法的延遲加載的示例代碼

    Python方法的延遲加載的示例代碼

    本篇文章主要介紹了Python方法的延遲加載的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-12-12
  • 排序算法之插入排序法解析

    排序算法之插入排序法解析

    這篇文章主要介紹了排序算法之插入排序法解析,插入排序法是一種簡(jiǎn)單但有效的排序算法,其基本思想是將一個(gè)待排序的元素逐個(gè)插入到已經(jīng)排好序的元素序列中,直至所有元素都被插入完成,從而得到一個(gè)有序序列,需要的朋友可以參考下
    2023-07-07
  • Python3.5 + sklearn利用SVM自動(dòng)識(shí)別字母驗(yàn)證碼方法示例

    Python3.5 + sklearn利用SVM自動(dòng)識(shí)別字母驗(yàn)證碼方法示例

    這篇文章主要給大家介紹了關(guān)于Python3.5 + sklearn利用SVM自動(dòng)識(shí)別字母驗(yàn)證碼的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Python具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05
  • Python yield 小結(jié)和實(shí)例

    Python yield 小結(jié)和實(shí)例

    yield的作用就是把一個(gè)函數(shù)變成一個(gè) generator,帶有 yield 的函數(shù)不再是一個(gè)普通函數(shù),Python 解釋器會(huì)將其視為一個(gè) generator(不知道什么是generator要先去理解一下Python的generator的了)
    2014-04-04

最新評(píng)論

永吉县| 隆德县| 洱源县| 乌审旗| 健康| 淅川县| 家居| 定边县| 九龙县| 托克逊县| 岳普湖县| 正宁县| 敖汉旗| 丰原市| 讷河市| 南康市| 呈贡县| 屏东市| 北流市| 当阳市| 呼玛县| 石景山区| 清原| 昭平县| 东兴市| 东台市| 阳高县| 镇原县| 武穴市| 壶关县| 都江堰市| 新源县| 甘孜县| 太湖县| 商洛市| 蓬溪县| 信宜市| 东港市| 娄底市| 柞水县| 辉南县|