# Flask Extension(01)\_Flask-SQLAlchemy(1) ###### tags: `book` `flask` `flask 2.x` `flask extension` `sqlalchemy` `python` [Flask-SQLAlchemy](https://flask-sqlalchemy.palletsprojects.com/en/3.0.x/) [SQLAlchemy](https://docs.sqlalchemy.org/) SQLAlchemy是一個用於python的資料庫套件,ORM的出現讓我們在操作資料庫上多了很多便利以及安全性。 想像一下你想要更新某一筆資料,也許你的資料庫語法會是: ```SQL= update sometable set col='A' where .... ``` 但如果是利用ORM的話,可能就只是: ```python record = get_one_record() record.col='A' ``` 我們完全是把資料當做物件導向的物件在操作,非常直觀,而且優雅。 當然,我始終鼓勵使用者一定要快速的看過一次官方文件,我這邊做的就是簡略的帶大家初步認識一下如何使用flask-sqlalchemy。 ## 初始化資料庫設置 ```python= from flask import Flask from flask_sqlalchemy import SQLAlchemy # 初始化sqlalchemy db = SQLAlchemy() # 初始化flask app = Flask(__name__) # 在flask的參數配置中定義資料庫連線 app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///project.db" # 利用init_app來渲染參數設置 db.init_app(app) ``` 上面的範例取自[官方快速入門](https://flask-sqlalchemy.palletsprojects.com/en/3.0.x/quickstart/#configure-the-extension),大致說明都寫在程式碼註解中。以上面的資料庫連線定義來看,我們使用的資料庫是sqlite。 :::info **Notes:** flask對於擴展(extension)的設置大部份都是這兩個步驟,定義參數,渲染參數 ::: :::info **Notes:** 資料庫的連線字串設置可參考[官方說明](https://docs.sqlalchemy.org/en/14/core/engines.html),或是flask-sqlalchemy中的[Connection URL Format](https://flask-sqlalchemy.palletsprojects.com/en/3.0.x/config/#connection-url-format) ::: 範例中初始化的`db`就是後續我們在flask中操作資料庫的一個依據,`db.Model`、`db.session`…等等,大概你想的到的都可以利用它來處理。 ## 定義model 說是定義model,其實就是我們平常在開一張table那樣,順著官方文件的範例,我們就來看一下該怎麼利用剛才生成的`db`來定義model: ```py= class User(db.Model): id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String, unique=True, nullable=False) email = db.Column(db.String) ``` :::info **Notes:** 在MVC的設計模式中,M即為model,也就是資料庫的部份 ::: 上面的範例中我們可以看到,類別`User`繼承了`db.Model`,然後裡面欄位的宣告則是用`db.Column`,型別則分別為`db.Integer`、`db.String`。就像剛剛說的那樣,都用`db`來處理。如果你有單獨用過sqlalchemy的話就會知道,真的要用你可能要import一堆需求的功能。 定義完model之後table並沒有真正的生成,我們還需要執行`db.create_all()`來生成table,不過這部份的動作必需是在flask的context中執行,所以測試情況下我們可以這麼做: ```python= with app.app_context(): db.create_all() ``` :::info **Notes:** 資料表(table)生成之後,即使你再調整model也不會變化,這時候你必需透過[Flask-Alembic](https://flask-alembic.readthedocs.io/en/stable/)或[Flask-Migrate](https://flask-migrate.readthedocs.io/en/latest/)來做資料表修正的處理,這後續會有說明。 ::: 因為我們沒有在實例化flask的時候特別指定instance的資料夾路徑,而且也沒有特別指定sqlite的路徑,所以預設情況下,你在執行之後就會在執行目錄下產生一個相對應的目錄,名稱為instance,不過我看[官方文件](https://flask.palletsprojects.com/en/2.2.x/tutorial/factory/)上面寫的是要自己建的才對: ![](https://hackmd.io/_uploads/S1fnnFwXi.png) 如果你有安裝pycharm的plugin或是sqlite的工具的話,你就可以打開來看一下目前資料庫中的資料表是不是跟我們所建置的一樣: ![](https://hackmd.io/_uploads/rJCi6Kv7o.png) ## 結論 透過這一篇文章的說明,我們快速瞭解可以怎麼樣的利用flask-sqlalchemy來建置model,進而生成table。楊千老師說,一天不要學太多東西,每天都要學一點,所以就此打住,下一篇文章就可以進入操作model的階段,不急。