2024年12月2日 星期一

flask 連線遠端 mysql 主機

在上一篇文章中

我們已經安裝好一台 ubuntu 20.04 並安裝了 mySQL ,版本是 8.0.44

現在我們在另一台電腦(windows)上開發 flask


一個最簡單的 flask 寫法如下

from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello():
return 'Welcome to My Watchlist!'

if __name__ == '__main__':
app.run(debug=True)

然後需要安裝 mySQL client 的套件,我選的套件是 mysql-connector-python

所以安裝方法就是  pip install mysql-connector-python

這裡有個坑,套件名稱千萬不要打成 mysql-connector

延伸閱讀


安裝好之後可以把程式改成下面這樣

from flask import Flask
import mysql.connector
from mysql.connector import Error

app = Flask(__name__)

# Establish the connection
def get_db_connection():
try:
conn = mysql.connector.connect(
user='mike',
password='pass',
host='192.168.0.31',
port=3306,
database='ocrDB',
autocommit=True
)
return conn
except Error as e:
print(f"Error: {e}")
return None


@app.route('/')
def hello():
conn = get_db_connection()
cursor = conn.cursor()
cursor.execute('SHOW TABLES')
tables = cursor.fetchall()
cursor.close()
conn.close()
return 'Welcome to My Watchlist!'


if __name__ == '__main__':
app.run(debug=True)

然後執行,觸發 def hello() 就會報錯了

詢問 chatgpt 後歸納成幾個原因

Summary of Steps to Resolve:

  1. Ensure MySQL is running on 192.168.0.31.
  2. Open port 3306 on the firewall of the MySQL server.
  3. Update MySQL bind-address in the configuration to allow remote connections.
  4. Grant remote access privileges to the MySQL user.

1. 在 mySQL 安裝的 ubuntu 上輸入 sudo service mysql status 即可確認 

2. 這邊 chatgpt 丟出了一句 sudo ufw allow 3306

首先 ufw 應該是預設有安裝的,但我們可以檢查一下狀態

$ ufw enable            // 啟動防火牆,執行後開機也會自動啟動

$ ufw disable           // 關閉防火牆

$ ufw status            // 查看防火牆狀態

$ ufw status verbose    // 查看防火牆詳細狀態

基本上就是把 3306 port 打開,這部分沒啥問題

延伸閱讀


3. 這邊 chatgpt 說

On the MySQL server, check the MySQL configuration file (my.cnf or my.ini), usually located in /etc/mysql/my.cnf or /etc/my.cnf (depending on the distribution). Ensure that the bind-address is set to either 0.0.0.0 or the specific server IP. Example:

bind-address = 0.0.0.0

沒問題,就按照它說的去改

在我的環境中,設定檔是位於 /etc/mysql/my.cnf

改好之後重新啟動 mySQL

sudo systemctl restart mysql

然後 mySQL 就掛了!

google 一下發現有人說你得寫成下面這樣才行

[mysqld]
bind-address = 0.0.0.0

存檔,重啟 mySQL 就成功了

延伸閱讀


4. 在上一篇文章我們就有授權給 remote user 了

所以這部分沒問題

順道一提這個 database='ocrDB' 是我事先在 ubuntu 上用 mySQL command line 開好的

改到目前這樣就可以用 debug 模式看到 cursor 拿回來的 table 是空的 (因為還沒開 table)

沒有 error 出現,可以順利跑完

以上,做個初學者紀錄,這篇就講到這


沒有留言:

張貼留言