flask 操作數據庫(分類) --


數據庫

數據庫是大多數動態web程序的基礎設施,只要你想把數據存下來,就離不開數據庫。

這里所說的數據庫指的是有存儲數據的單個或多個文件組成的集合,它是一種容器,可以類比文文件櫃。而人們通常使用數據庫來表示操作數據庫的軟件,這類管理數據庫的軟件被稱為數據庫管理系統,常見的數據庫管理系統(DBMS)有MySQL、SQLite、MongoDB等。為了便於理解,我們可以把數據庫看作一個大倉庫,倉庫里有一些負責搬運貨物的機器人,而數據庫管理系統就是操控機器人搬運貨物的程序。

 

下面我們來學習如何給Flask程序添加數據庫支持。具體來說,是如何學習在python中使用這些DBMS來對數據庫進行管理和操作。

 

 

數據庫的分類

數據庫一般分為兩種,SQL(Structured Query Language,結構化查詢語言)數據庫和NoSQL(Not Only SQL,泛指非關系型)數據庫。

 

SQL

SQL數據庫指關系型數據庫,常用的SQL DBMS主要包括SQL Server、Oracle、MySQL、SQLite等。關系型數據庫使用表來定義數據對象,不同的表之間使用關系連接。下表是一個身份消息表示例:

 

在SQL數據庫中,每一行代表一條記錄,每條記錄又由不同的列(column)組成。在存儲數據前,需要預定義表模式(schema),以定義表的結構並限定列的輸入數據類型。

 

先來了解幾個基本概念:

1)  表(table):存儲數據的特定結構

2)  模式(schema):定義表的結構信息。

3)  列/字段(column/field):表中的列,存儲一系列特定的數據,列組成表。

4)  行/記錄(row/record):表中的行,代表一條記錄。

5)  標量(scalar):指的是單一數據,與之相對的是集合(collection)。

 

NoSQL

NoSQL最初指No SQL或No Relational,現在NoSQL社區一般戶解釋為Not Only SQL。NoSQL數據庫泛指不使用傳統關系型數據庫中的表格形式的數據庫。近年來,NoSQL數據庫越來越流行,被大量應用在實時(real-time)Web程序和大型程序中。與傳統的SQL數據庫相比,它在速度和可擴展性方面有很大的優勢,除此之外還擁有無模式(schema-free)、分布式、水平伸縮(horizontally scalable)等特點。

最常用的兩種NoSQL數據庫如下所示:

文檔存儲

文檔存儲時NoSQL數據庫中最流行的種類,它可以作為主數據庫使用。文檔存儲使用的文檔類似SQL數據庫中的記錄,文檔使用類JSON格式來表示數據。常見的文檔存儲DBMS有MongoDB、CouchDB等。

前面的身份信息表的第一條記錄使用該文檔可以表示為:

{

  id: 1,

  name: "Nick",

  sex: "Male"occupation: "Journalist"

}

 

鍵值對存儲(key-value store)

鍵值對存儲在形態上類似python中的字典,通過鍵來存儲數據,在讀取上非常快,通常用來存儲臨時內容,作為緩存使用。常見的鍵值對DBMS有Redis、Riak等,其中Redis不僅可以管理鍵值對數據庫,還可以作為緩存后端(cache backend)和消息代理(message broker)。

另外,還有列存儲(column store,又被稱為寬列式存儲)、圖存儲(graph store)等類型的NoSQL數據庫。

 

如何選擇?

NoSQL數據庫不需要定義表和列等結構,也不限定存儲的數據格式,在存儲方式上比較靈活,在特定的場景下效率更高。SQL數據庫稍顯復雜,但不容易出錯,能夠適應大部分的應用場景。這兩種數據庫都各有優勢,也各有擅長的領域。兩者並不是對立的,我們需要根據使用場景選擇合適的數據庫類型。大型項目通常會同時需要多種數據庫,比如使用MySQL作為主數據庫存儲用戶資料和文章,使用Redis(鍵值對型數據庫)緩存數據,使用MongoDB(文檔型數據庫)存儲實時消息。

 

大多數情況下,SQL數據庫都能滿足你的需求。

ORM魔法

在web應用里使用原生SQL語句操作數據庫主要存在下面兩類問題:

 

1)  手動編寫SQL語句比較乏味,而且視圖函數中加入太多SQL語句會降低代碼的易讀性。另外還會容易出現安全問題,比如SQL注入。

2)  常見的開發模式是在開發時使用簡單的SQLite,而在部署時切換到MySQL等更健壯的DBMS。但是對於不同的DBMS,我們需要使用不同的Python接口庫,這讓DBMS的切換變得不太容易。

 

盡管使用ORM可以避免SQL注入問題,但仍然需要對傳入的查詢參數進行驗證。另外,在執行原生SQL語句時也要注意避免使用字符串拼接或字符串格式化的方式傳入參數。

使用ORM可以很大程度上解決這些問題。它會自動幫你處理查詢參數的轉義,盡可能的避免SQL注入的發生。另外,它為不同的DBMS提供統一的接口,讓切換工作變得簡單。ORM扮演翻譯的角色,能將我們的python語言轉換為DBMS能夠讀懂的SQL指令,讓我們能用python來操控數據庫。

 

ORM把底層的SQL數據實體轉化成高層的python對象,這樣你可以不用了解SQL,只通過python代碼即可完成數據庫操作,ORM主要實現了三層映射關系:

1)  表—》python類。

2)  字段(列)--》類屬性

3)  記錄(行)--》類實例

比如,我們要創建一個contacts表來存儲留言,其中包含用戶名稱和電話號碼兩個字段。在SQL中,下面的代碼用來創建這個表:

CREATE TABLE contacts(

       name varchar(100) NOT NULL,

       phone_number varchar(32),

);

 

如果使用ORM,可以使用類似下面的python類來定義這個表:

from foo_orm import Model, Column, String

class Contact(Model):
    __tablename__  = 'contacts'
    name = Column(String(100), nullable=False)
    phone_number = Column(String(32))
 

要向表中插入一條記錄,需要使用下面的SQL語句:

INSERT INTO contacts(name, phone_number) VALUES(‘Sam Xia’, ‘1234567889’)

 

使用ORM則只需要創建一個Contact類的實例,傳入對應的參數表示各個列的數據即可。

下面的代碼和上面的SQL語句效果相同:

contact = Contact(name = ‘Sam Xia’, phone_number=’123456789’)

 

除了便於使用,ORM還有下面這些優點:

1)  靈活性好。既可以使用高層對象來操作數據庫,又支持執行原生SQL語句

2)  提升效率。從高層對象轉換成原生SQL會犧牲一些性能,但這微不足道的性能犧牲換取的是巨大的效率提升。

3)  可移植性好。ORM通常支持多種DBMS,包括MySQL、PostgreSQL、SQLite等。可以隨意更換DBMS,只需要稍微改動少量配置。

 

使用python實現的ORM有SQLAlchemy、Peewee、PonyORM等。其中SQLAlchemy是python社區使用最廣泛的ORM。SQL-Alchemy,直譯過來就是SQL煉金術。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM