SQLAlchemy 的初步使用
先放上官方文檔SQLAlchemy 1.2 Documentation
當然大部分同學肯定難以理解如此長如此長的英文文檔。所以在這裡先做一個SQLAlchemy的初步使用的介紹。
什麼是SQLAlchemy?
SQLAlchemy 是一種對象關係映射模型(Object Relational Mapper), 簡稱ORM。
它展現了一種將用戶定義的python中的類映射到資料庫中表的方法。類的實例,就相當於表中的一行數據。簡單來說呢, 就是讓我們從SQL語句中抽離出來,只需要按照python的語法來寫, 它會自動轉換為相對應的SQL語句。
python中的類 == 資料庫中的表
python中的類的屬性 == 表中的欄位
python中類的實例 == 表中的行
python中的ORM框架
SQLAlchemy呢, 僅僅是python的orm框架中的一種實現。關於python中其他的orm框架,可以看這個鏈接。
除了sqlalchemy, python還有哪些orm框架呢?
SQLAlchemy的使用
1. 所有的資料庫操作, 我們首先要創建一個連接。 告訴我們的代碼, 連接到我們資料庫的路徑。
from sqlalchemy import create_enginennengine = create_engine("mysql://user:password@hostname/dbname?charset=uft8",n echo=True)n
create_engine的可選參數很多, 有幾個比較常用的。
echo: True的時候,會列印所有的狀態變化, 包括轉換的SQL語句。 一般在生產環境中呢,我們是把它設置為Flase的。
max_overflow : 允許連接到資料庫的最大連接數.
2. 然後創建一個聲明類,映射類到表的關係。
from sqlalchemy.ext.declarative import declarative_basennBase = declarative_base()n
這又是一個什麼東東呢? declarative_base()構造一個自定義的聲明的類。說人話呢, 就是調用這個方法, 可以產生一個基類。這個基類,和它的子類,可以通過接受到的數據呢, 映射成一張表。
所以, 如果我們要操作資料庫中的表, 我們都必須繼承這個基類。
3. 定義我們的python類 - -> 資料庫中的表
from sqlalchemy import Column, Integer, Stringnnclass Phone_Table(Base):n # 表名n __tablename__ = phone_tablenn id = Column(String(255), primary_key=True, unique=True)n item_id = Column(String(10))n name = Column(String(120))n crawl_time = Column(String(100))nn def __int__(self, id, item_id, name, price, type, phone, operator, location,n portal, Relevance, crawl_time):n self.id = idn self.item_id = item_idn self.name = namen self.crawl_time = crawl_timen
每個類一定要有__tablename__!!! 也就是一定要有表名。
Column : 代表數據表中的一列。
它的常用參數有:
autoincrement : True . 表示這個欄位是自增的。
index : True. 設置這個欄位為索引。
nullable : True. 允許次欄位為空。
primary_key : True. 設置此欄位為主鍵。非常值得注意的是!!!! SQLAlchemy中, 每個類中至少有一個主鍵!!!
unique : True. 設置此欄位唯一。此欄位相同的數據,第一條數據插入後, 之後的就不允許再插入了, 直接 pass 掉。
sqlalchemy中, 關於我們平時常見的欄位類型都有。
String , Text, Integer, Float, DateTime, Boolean 等等等等。。。
如果, 我有時間的話。。。以後就作為高階一起講吧。
現在, 我們指定了去往我們資料庫的路徑, 作為engine。寫好了python的類, 也就是定義好了, 我們想要的表的格式。 下一步呢, 就是,把我們想要的這張表呢, 創建出來。
4 . 創建數據表
Base.metadata.create_all(engine)n
蹬蹬蹬蹬, 一句話, 就可以根據我們之前的定義的元數據, 創建出我們要的數據表啦。
之前, 我總是搞不清楚, 什麼是元數據。 難道數據還有圓的 ,方的嗎, 哈哈。
元數據呢?
其實就是描述數據的數據。
比方說, 相片, 是數據吧。我們通過肉眼可以判斷這這張照片和其他照片的區別。但是機器不可以呀, 機器呢, 要通過它的解析度, 尺寸, RGB值,等等各種各種描述這張相片的數據區分出它和其他相片的區別。
我們要創建一張數據表, 什麼樣的數據表呢?
我們要告訴計算機, 我要的表叫什麼名字, 在哪個資料庫, 你可以怎麼連接它。這些就是元數據啦。
現在我們已經有了數據表, 但是它是空的,所以, 我們要進行一些不可描述的操作啦。
敲黑板, 劃重點, 劃重點, SQLAlchemy的難點來了。
5 . 向表中插入數據。
先上代碼。
DBSession = sessionmaker(bind=engine)n session = DBSession()n
這有是什麼鬼呢?
首先, 我們可以根據字面意思看到。會話製造工廠。然後實例了session。其實也挺形象的。
sessionmaker 是一個可以不斷產生新會話的類。
在我們初學一門語言時, 一定會學習如何用它去連接資料庫。這個過程,我們首先需要連接到資料庫, 這就好比是修路, 然後我們需要獲得一個cursor(游標),就好比是通車。這樣,我們才能與資料庫之間通信。
而在sqlaAlchemy中, 我們通過create_engine 建立連接, 通過會話來建立自己代碼與資料庫的通信(其實, 和游標的作用很相似)。
現在我們有了路, 也有了車。
1.寫入一行的數據。------> 實例化我們定義的聲明類
# dic 字典形式的數據。ndic = {}nitem = Phone_Table(id=id, item_id=dic[item_id], name=dic[item_name], n crawl_time=dic[crawl_time])n
2. 把數據放上車 (sqlAlchemy是lazy的)
session.add(item)n
3.老司機開車, 觸發insert 語句。
session.commit()n
4. 開完車, 收車。
session.close()n
6 . 查詢數據
通過query關鍵字查詢。
- query.all(),all()返回列表
- query.first():返回第一個元素
- query.one()有且只有一個元素時才正確返回。
從資料庫query的數據, 通過老司機的車session, 運送到我們這裡。
session.query(Phone_Table)n
如果我們只想要查詢其中幾個欄位
session.query(Phone_Table.id, Phone_Table.item_id)n
我現在又想查詢名字為隔壁老王的所有信息。
session.query(Phone_Table).filter(Phone_Table.name==隔壁老王)n
查詢隔壁老王與阿嬌的所有通話時間的記錄
session.query(Phone_Table.crawl_time).filter_by(name=隔壁老王).all()n
欸?怎麼一個filter , 一個filter_by.
filter_by 呢? 通過列表做一些簡單的查詢。
filter 可以做filter_by做的事情, 同時它還能兼容一些sql的語法。
同時, 我們可以看到。
filter 中是 == , 這意味著它接受可選數量的表達式,你可使用sql表達式或者keyword表達式。
column == expressionn
filter_by 中是 = 接受一個關鍵字
keyword = expressionn
What's the difference between filter and filter_by in SQLAlchemy?
還有許多高級用法沒講, 不過到這裡日常簡單使用差不多啦。之後等我用到了, 總結了再講吧。太晚太晚了, 困得不行。看會極限挑戰就去睡覺啦。最後, 留下stackoverflow 一個不錯的討論
flash 和 commit 的討論。
SQLAlchemy: What's the difference between flush() and commit()?
7.問題來了!如果這個數據表已經存在了,我並不想再定義一遍, 我只是需要查詢該怎麼辦呢?
這個博客講的很清楚啦, 我就不重複啦。
sqlalchemy 示例 | 你是有多喜歡玩遊戲啊
推薦閱讀:
TAG:SQLAlchemy | Python | python爬虫 |