中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么在Python中使用SQLAlchemy

發布時間:2021-04-01 16:25:20 來源:億速云 閱讀:222 作者:Leah 欄目:開發技術

怎么在Python中使用SQLAlchemy?相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。

一. 介紹

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

關于ORM:

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

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

具體的實現方式是將數據庫表轉換為Python類,其中數據列作為屬性,數據庫操作作為方法。

優點:

  • 簡潔易讀:將數據表抽象為對象(數據模型),更直觀易讀

  • 可移植:封裝了多種數據庫引擎,面對多個數據庫,操作基本一致,代碼易維護

  • 更安全:有效避免SQL注入

為什么要用sqlalchemy?

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

二. 使用

概念和數據類型

概念


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

常見數據類型


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

創建數據庫表

1.安裝

pip install SQLalchemy

2. 創建連接

from sqlalchemy import create_engine

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

這行代碼初始化創建了Engine,Engine內部維護了一個Pool(連接池)和Dialect(方言),方言來識別具體連接數據庫種類。

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

create_engine還有其它可選的參數,比如:

engine = create_engine("mysql://user:password@hostname/dbname?charset=uft8",
            echo=True,
            pool_size=8,
            pool_recycle=60*30
            )
  • echo: 當設置為True時會將orm語句轉化為sql語句打印,一般debug的時候可用

  • pool_size: 連接池的大小,默認為5個,設置為0時表示連接無限制

  • pool_recycle: 設置時間以限制數據庫多久沒連接自動斷開

3. 創建數據庫表類(模型)

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

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

數據庫表模型類通過__tablename__和表關聯起來,Column表示數據表的列。

4. 生成數據庫表

Base.metadata.create_all(engine)

創建表,如果存在則忽略,執行以上代碼,就會發現在db中創建了users表。

操作數據

表創建好了就是操作數據了,常見的操作增刪改查,我們一一介紹。

session

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

通過sessionmaker調用創建一個工廠,并關聯Engine以確保每個session都可以使用該Engine連接資源:

from sqlalchemy.orm import sessionmaker

# 創建session
DbSession = sessionmaker(bind=engine)
session = DbSession()

session的常見操作方法包括:

  • flush:預提交,提交到數據庫文件,還未寫入數據庫文件中

  • commit:提交了一個事務

  • rollback:回滾

  • close:關閉

舉個最簡單的例子:

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

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

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

可以在add之后執行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)

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

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

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

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

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



更新數據有兩種方法,一種是使用query中的update方法:



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

更新數據有兩種方法,一種是使用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)

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

和更新數據類似,刪除數據也有兩種方法,第一種:

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的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

岐山县| 绍兴市| 株洲县| 石阡县| 黄浦区| 桂阳县| 武定县| 西盟| 睢宁县| 三河市| 扎赉特旗| 凤台县| 杭锦后旗| 霍州市| 镇康县| 合川市| 克拉玛依市| 蒙自县| 保定市| 修水县| 裕民县| 集贤县| 光山县| 天全县| 花莲县| 本溪| 辽宁省| 泽州县| 同江市| 秦皇岛市| 分宜县| 南昌市| 林甸县| 二连浩特市| 福鼎市| 宁国市| 卓尼县| 祁阳县| 大连市| 自贡市| 盱眙县|