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爬虫 |