Skip to content
On this page

與資料庫對話(MySQL)篇

上一篇建立是本機的資料庫,這篇來使用 pymysql 模組連線資料庫。

我手頭上收到一組.sql檔案,使用xampp來匯入並模擬線上phpmysql,這代表必須事先了解這資料庫的每個資料表欄位類型,才能確保連線後的動作是否正確。

環境安裝

  • Sqlalchemy
  • Pymysql
cmd
pip install sqlalchemy pymysql

與資料庫連線(database.py)

基本上與上一篇大同小異,僅差在 URLconnect_args 不同。

py
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

DATABASE_URL = "mysql+pymysql://root@localhost:3306/我的資料庫"
engine = create_engine(
    DATABASE_URL, connect_args={}
)

SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
Base = declarative_base()

解釋一下 pymysql 連線設定 :

mysql + pymysql : // {帳號} : {密碼} @ {路徑} : {port} / {資料庫}

如果沒有密碼就不要輸入資料,就像範例一樣。

建立資料表 ( models.py )

承如上一開始所敘述由於是要連線到已經存在的資料庫內,所必須了解原數據類型,以免產生不必要的錯誤,以下是我收到的資料庫其中一份資料表內容。 old_db

先引入 sqlalchemy 所支援的欄位類型,可參考下方連結 :

py
from sqlalchemy import Column,  Integer, String, DateTime, Text,Float

引入上一段資料庫連線模組 database.py內的 Base

py
from database import Base

開始針對資料表欄位舉出類型,可參考下方兩個連結確認支援類型。

py
class products(Base):
    __tablename__ = "products"
    id = Column(Integer, primary_key=True, index=True)
    ppcode = Column(String(20), unique=True, index=True)
   ..
    weight = Column(Float)
   ..
    description = Column(Text)
    create_date = Column(DateTime)
    ..
    origincode = Column(String(255))
    parent_id = Column(Integer)
   ..

這串是針對與數個資料表的某個欄位相互對應所用,如果沒有可省略。

py
   items = relationship("Item", back_populates="owner")

執行看看結果

如過無法連線,常見有問題有以下幾種 :

  • mysql伺服器是否運作。
  • 連線資料 (帳號、密碼、資料庫名稱) 是否正確。
  • 資料表欄位類型、名稱是否正確。( 下圖是未找到指定的資料表 ) can_not_found_table
  • 引入 資料庫連線模組路徑 是否正確。
  • 伺服器未開啟連線 : can_not_link