本文將以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
**優勢: **數據庫
爲何要用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 )
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的常見操做方法包括:
增
舉個最簡單的例子:
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