Google Code Prettify

2019年8月25日 星期日

Python: ORM using Flask

from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
from sqlalchemy import Column, Integer, String
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker

class Contacts(Base):
    __tablename__ = 'contacts'
    name = Column(String(100), primary_key=True, nullable=False)
    phone_number = Column(String(32))

# 連線到資料庫
engine = create_engine("mysql+pymysql://root:password@localhost/test?charset=utf8")

# 建立 transaction
session = sessionmaker(engine)
mySession = session()

# 查詢
result = mySession.query(Contacts).first()
print(result.name)

# 新增資料
mySession.add_all([Contacts(name='Steven', phone_number='0963210089')])
mySession.commit()

Flask 是和 Django 一樣,是 python 非常流行的 web framework ,上面是以 ORM 方式存取資料庫的程式,說明如下:
  • 資料庫
我使用 MariaDB,使用時可以將它視為 MySQL,我在裡面建了一個命名為 test 的資料庫,裡面有個名為 Contacts 的 table,如下:
  • 安裝套件
我使用 PyCharm 開發,要先安裝相關套件,安裝的方式是在「File > Settings > Project: flask > Project Interpreter」中,按右方的「+」,可以搜尋要安裝的 package,這裡請先安裝 (1) Flask (2) SQLAlchemy (3) PyMySQL。

PyMySQL 是連接資料庫的程式庫,SQLAlchemy 則是 ORM 程式庫。
  • 程式說明
既然是 ORM,首先就要將程式對映到 table。
    • line 2: 取得SQLAlchemy 的基礎類別
    • line 7~10: 將程式對映到 table Contacts
    • line 13: 連線到資料庫,連線字串前的 mysql+pymysql 指出了要使用 pymysql API 連線到 MySQL。
    • line 16~17: session 就如 Java 中的 transaction
    • line 20~21: 查詢並取得第一列的結果印出來
    • line 24~25: 新增一筆資料

除了上面的方法,還可再安裝 Flask-SQLAlchemy package,程式如下:
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from sqlalchemy import Column, String

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = "mysql+pymysql://root:password@localhost/test?charset=utf8"
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)

class Contacts(db.Model):
    __tablename__ = 'contacts'
    name = Column(String(100), primary_key=True, nullable=False)
    phone_number = Column(String(32))

item1 = Contacts.query.first()
print(item1.name)
print(item1.phone_number)
  • 程式說明:
    • line 6: Flask-SQLAlchemy 套件,資料庫的 URI 要放在 SQLALEMY_DATABASE_URI 程式設定裡。
    • line 7: 這一行可以不需要,將 SQLALCHEMY_TRACK_MODIFICATIONS 設定為 False,可以讓警告訊息不要出現。
    • line 8: 經由這個方式,db 這個類別可以使用 Flask-SQLAlchemy 提供的所有功能。