欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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)文章

最新評(píng)論