日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

Python SQLAlchemy入门教程

發(fā)布時間:2024/10/8 python 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python SQLAlchemy入门教程 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

原文:https://www.cnblogs.com/ybjourney/p/11832045.html

Python SQLAlchemy入門教程

  • 一、介紹
    • 關(guān)于ORM
    • 為什么用sqlalchemy
  • 二、使用方法
    • 概念和數(shù)據(jù)類型
    • 使用步驟
      • 1.安裝包
      • 2.創(chuàng)建連接
      • 3.創(chuàng)建數(shù)據(jù)庫表類(模型)
      • 4.生成數(shù)據(jù)庫表
  • 三、增刪改查
    • 增加
    • 查詢
    • 修改
    • 刪除

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

一、介紹

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

關(guān)于ORM

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

特點是操縱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ù)類型

對應(yīng)數(shù)據(jù)庫中的概念

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

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

數(shù)據(jù)類型數(shù)據(jù)庫數(shù)據(jù)類型python數(shù)據(jù)類型說明
Integerintint整型,32位
Stringvarcharstring字符串
Texttextstring長字符串
Floatfloatfloat浮點型
BooleantinyintboolTrue/False
Datedatedatetime.date存儲時間(年月日)
Timetimedatetime.datetime存儲時分秒

使用步驟

1.安裝包

pip install SQLalchemy

2.創(chuàng)建連接

from sqlalchemy import create_engine engine = create_engine("mysql+pymysql://root:123456@127.0.0.1:3306/springbootdb?charset=utf8")

這行代碼初始化創(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+pymysql://root:123456@127.0.0.1:3306/springbootdb?charset=utf8",echo=True, pool_size=8, pool_recycle=60 * 30)
  • echo: 當設(shè)置為True時會將orm語句轉(zhuǎn)化為sql語句打印,一般debug的時候可用
  • pool_size: 連接池的大小,默認為5個,設(shè)置為0時表示連接無限制
  • pool_recycle: 設(shè)置時間以限制數(shù)據(jù)庫多久沒連接自動斷開

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

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

from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column, Integer, String# 創(chuàng)建數(shù)據(jù)庫表類(模型) 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 = nameself.email = email

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

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

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

# 生成數(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)建一個工廠,并關(guān)聯(lián)Engine以確保每個session都可以使用該Engine連接資源:

from sqlalchemy.orm import sessionmaker# 創(chuàng)建session DbSession = sessionmaker(bind=engine) session = DbSession()

session的常見操作方法包括:

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

三、增刪改查

增加

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中g(shù)et到對象的屬性。

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(Users.id == 5).all()

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

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

修改

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

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

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

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()

總結(jié)

以上是生活随笔為你收集整理的Python SQLAlchemy入门教程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。