Python SQLAlchemy入門教程

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

一. 介紹

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

關於ORM:mysql

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

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

具體的實現方式是將數據庫錶轉換爲Python類,其中數據列做爲屬性,數據庫操做做爲方法。sql

**優勢: **數據庫

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

爲何要用sqlalchemy?安全

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

二. 使用

概念和數據類型

概念app

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

常見數據類型

數據類型 數據庫數據類型 python數據類型 說明
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 存儲時分秒

使用步驟

建立數據庫表

**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
                       )
  1. echo: 當設置爲True時會將orm語句轉化爲sql語句打印,通常debug的時候可用
  2. pool_size: 鏈接池的大小,默認爲5個,設置爲0時表示鏈接無限制
  3. 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的常見操做方法包括:

  1. flush:預提交,提交到數據庫文件,還未寫入數據庫文件中
  2. commit:提交了一個事務
  3. rollback:回滾
  4. 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()

一般這兩個方法都會用到的,因此必定要掌握它們的區別:

filter filter_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的基本用法。

代碼可參照:my github

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

相關文章
相關標籤/搜索