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

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

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

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

一. 介紹

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

關于ORM:

全稱Object Relational Mapping(對象關系映射)。

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

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

優(yōu)點:

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

為什么要用sqlalchemy?

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

二. 使用

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

概念

概念 對應數(shù)據(jù)庫 說明
Engine 連接 驅(qū)動引擎
Session 連接池,事務 由此開始查詢
Model 類定義
Column
Query 若干行 可以鏈式添加多個條件

常見數(shù)據(jù)類型

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

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

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)部維護了一個Pool(連接池)和Dialect(方言),方言來識別具體連接數(shù)據(jù)庫種類。

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

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

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

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

前面有提到ORM的重要特點,那么我們操作表的時候就需要通過操作對象來實現(xiàn),現(xiàn)在我們來創(chuàng)建一個類,以常見的用戶表舉例:

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)部封裝的一個方法,通過其構造一個基類,這個基類和它的子類,可以將Python類和數(shù)據(jù)庫表關聯(lián)映射起來。

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

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

Base.metadata.create_all(engine)

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

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

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

session

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

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

from sqlalchemy.orm import sessionmaker

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

session的常見操作方法包括:

  • flush:預提交,提交到數(shù)據(jù)庫文件,還未寫入數(shù)據(jù)庫文件中
  • commit:提交了一個事務
  • rollback:回滾
  • close:關閉

舉個最簡單的例子:

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

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

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

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

Q2:如何進行批量插入,性能比較?

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

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

查詢是最常用的一個操作了,舉個最簡單的查詢例子:

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

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

其中,query有filter和filter_by兩個過濾方法,上述例子也可寫為:

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

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

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

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

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

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

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

另一種是操作對應的表模型:

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

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

和更新數(shù)據(jù)類似,刪除數(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()

批量刪除時推薦使用第二種。

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

代碼可參照:my github

總結(jié)

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

相關文章

最新評論