Google Code Prettify

2019年8月25日 星期日

Python: ORM using Flask

  1. from sqlalchemy.ext.declarative import declarative_base
  2. Base = declarative_base()
  3. from sqlalchemy import Column, Integer, String
  4. from sqlalchemy import create_engine
  5. from sqlalchemy.orm import sessionmaker
  6.  
  7. class Contacts(Base):
  8. __tablename__ = 'contacts'
  9. name = Column(String(100), primary_key=True, nullable=False)
  10. phone_number = Column(String(32))
  11.  
  12. # 連線到資料庫
  13. engine = create_engine("mysql+pymysql://root:password@localhost/test?charset=utf8")
  14.  
  15. # 建立 transaction
  16. session = sessionmaker(engine)
  17. mySession = session()
  18.  
  19. # 查詢
  20. result = mySession.query(Contacts).first()
  21. print(result.name)
  22.  
  23. # 新增資料
  24. mySession.add_all([Contacts(name='Steven', phone_number='0963210089')])
  25. 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,程式如下:
  1. from flask import Flask
  2. from flask_sqlalchemy import SQLAlchemy
  3. from sqlalchemy import Column, String
  4.  
  5. app = Flask(__name__)
  6. app.config['SQLALCHEMY_DATABASE_URI'] = "mysql+pymysql://root:password@localhost/test?charset=utf8"
  7. app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
  8. db = SQLAlchemy(app)
  9.  
  10. class Contacts(db.Model):
  11. __tablename__ = 'contacts'
  12. name = Column(String(100), primary_key=True, nullable=False)
  13. phone_number = Column(String(32))
  14.  
  15. item1 = Contacts.query.first()
  16. print(item1.name)
  17. print(item1.phone_number)
  • 程式說明:
    • line 6: Flask-SQLAlchemy 套件,資料庫的 URI 要放在 SQLALEMY_DATABASE_URI 程式設定裡。
    • line 7: 這一行可以不需要,將 SQLALCHEMY_TRACK_MODIFICATIONS 設定為 False,可以讓警告訊息不要出現。
    • line 8: 經由這個方式,db 這個類別可以使用 Flask-SQLAlchemy 提供的所有功能。

沒有留言:

張貼留言