Web開發系列(六):關係型資料庫,ORM
資料庫,web開發中總是離不開這個核心應用,可以說web開發的核心就是資料庫。但資料庫是一個泛稱,通常我們說的 資料庫是指關係型資料庫,此外還有非關係型資料庫。在這篇文章中,我們單指關係型資料庫。
相信大家都看過excel表格,在PostgreSQL中,每個資料庫包含多個schema,每個schema中可以包含多個表,而這個表, 就好比是我們平時見到的excel表格,但是它的特點是列數是固定的,行數是可變的。當然,列也可以通過關係型資料庫管理系統 來更改。什麼叫做關係型資料庫管理系統呢?
我們要這樣想,資料庫是用來管理資料的,資料是要儲存在作業系統的磁碟上的,而我們平常所說的資料庫,實際上就是幫我們 管理這些檔案(以及其他相關東西)的管理系統。而我們操縱資料庫便是通過SQL來完成的。
常見的關係型資料庫管理系統(以下簡稱資料庫)有SQLite,MySQL,Postgesql等。他們各有特點,例如SQLite一般用於移動裝置, 而MySQL和PostgreSQL則用於伺服器。
在日常開發中有一個必須要搞清楚的概念,就是ofollow,noindex" target="_blank">表的連線 如果你去面試, 那麼將會有很大概率被問到:什麼是內連線,什麼是外連線。。。等等。
SQLAlchemy
在日常開發中,一般我們很少直接寫SQL,一般都會用ORM:Object-relational mapping,通過ORM我們可以把類和資料庫中的表 對應起來,例如Python中ORM的黃金標準便是SQLAlchemy 。
學習SQLAlchemy我推薦閱讀官方的教程:http://docs.sqlalchemy.org/en/latest/orm/tutorial.html
我們來看一個SQLAlchemy的例子,宣告一個表:
from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column, Integer, String Base = declarative_base() class User: __tablename__ = 'users' id = Column(Integer, primary_key=True) name = Column(String(32)) fullname = Column(String(32)) nickname = Column(String(64), nullable=False) passwd = Column(String(128), nullable=False)
而查詢,則是類似這樣:
>>> session.query(User).filter( User.id == 1 ).first()
SQLAlchemy會自動把上述的Python程式碼翻譯成SQL,執行,然後對映成User類的示例,於是結果便可以user.name
這樣用。
migration工具
用SQLAlchemy的時候我們還能獲得一個好處,便是我們可以很方便的知道表是怎麼定義的,此外,我們還可以藉助alembic 來做資料庫變更記錄,但是用alembic的時候我們也許不想手動 寫變更,想讓alembic自己生成,那麼我們要好好地組織SQLAlchemy的程式碼,讓SQLAlchemy的metadata可以記錄下所有的表,然後 在alembic的配置裡引入這個metadata,便可以通過alembic生成。