Flask 后端与 SQL Server/MySQL 数据库集成指南
1. 数据库安装与运行
1.1 Windows 本地使用 Docker
-
SQL Server (Docker):可在 Windows 上安装 [Docker Desktop],然后通过
docker run
启动 SQL Server 容器。例如:docker run -e 'ACCEPT_EULA=Y' -e 'SA_PASSWORD=Pass@word' -p 1433:1433 -d mcr.microsoft.com/mssql/server:2019-latest
以上命令启动了一个 SQL Server 2019 容器,将宿主机的 1433 端口映射到容器的 1433 端口,可通过
sa
用户和指定密码进行连接。 -
MySQL (Docker):拉取官方 MySQL 镜像后,执行:
docker run -itd --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:latest
该命令运行了一个 MySQL 容器,将宿主机 3306 端口映射到容器 3306。启动后可使用
root/123456
登录 MySQL 服务。
1.2 Linux 服务器部署
-
Docker 方式:Linux 服务器同样可使用上述
docker run
命令部署容器,并确保开放对应端口(1433、3306)。 -
直接安装方式:
-
MySQL:在 Ubuntu 上可使用包管理安装:
sudo apt-get update && sudo apt-get install mysql-server
。安装完成后,可运行sudo mysql_secure_installation
设置 root 密码和安全选项。 -
SQL Server (Linux):可参考微软官方文档进行安装。以 Ubuntu 为例,可运行:
curl https://packages.microsoft.com/keys/microsoft.asc | sudo apt-key add - curl https://packages.microsoft.com/config/ubuntu/20.04/mssql-server-2019.list | sudo tee /etc/apt/sources.list.d/mssql-server.list sudo apt-get update sudo apt-get install mssql-server sudo /opt/mssql/bin/mssql-conf setup
在
mssql-conf setup
过程中设置SA
密码并接受 EULA。安装后使用sudo systemctl start mssql-server
启动服务,并可sudo systemctl enable mssql-server
设为开机自启。
-
2. 数据库图形化管理
- SQL Server Management Studio (SSMS):微软官方工具,仅支持 Windows。打开 SSMS,在“服务器名称”中输入
主机名,端口
(本地容器可填写localhost,1433
),使用sa
用户和密码登录。 - MySQL Workbench:官方跨平台工具。新建连接时填写 Host(本地容器可用
127.0.0.1
)、Port(通常为 3306)、Username (root
) 和 Password。例如容器已映射到宿主机 3306 端口,则 Host 可填127.0.0.1
。 - DBeaver:开源通用数据库管理工具,支持 MySQL、SQL Server 等多种数据库。新建连接时选择对应数据库类型,输入主机、端口、数据库名、用户名和密码。
- 连接提示:连接 Docker 容器时,Host 通常为本机地址(如
127.0.0.1
或localhost
),端口为容器映射的端口号。远程连接数据库时,Host 应填写服务器公网/IP 地址,并确保服务器的防火墙或安全组已开放相应端口(1433/3306)。
3. Flask 连接数据库
-
MySQL (PyMySQL):先安装驱动
pip install pymysql
。在 Flask 应用中可直接使用 PyMySQL 连接。示例代码:import pymysql conn = pymysql.connect( host='localhost', user='root', password='123456', db='testdb', port=3306, charset='utf8mb4' ) cursor = conn.cursor() cursor.execute("SELECT * FROM table_name") results = cursor.fetchall()
如所示,使用
pymysql.connect
并提供主机、用户、密码、数据库名等参数即可建立连接。然后使用cursor.execute()
执行 SQL,用cursor.fetchall()
或cursor.fetchone()
获取查询结果。 -
MySQL (mysql-connector-python):先安装
pip install mysql-connector-python
。代码示例:import mysql.connector conn = mysql.connector.connect( host='localhost', user='root', password='123456', database='testdb', port=3306, charset='utf8mb4' ) cursor = conn.cursor() cursor.execute("SELECT * FROM table_name") records = cursor.fetchall()
通过
mysql.connector.connect
提供相应参数来连接 MySQL,然后类似地使用游标执行查询并获取结果。 -
SQL Server (PyODBC):安装
pip install pyodbc
,并确保系统已安装对应的 SQL Server ODBC 驱动(Windows 下安装 “ODBC Driver 17 for SQL Server”;Linux 下可sudo apt-get install msodbcsql17
)。示例:import pyodbc conn = pyodbc.connect( 'DRIVER={ODBC Driver 17 for SQL Server};' 'SERVER=localhost,1433;DATABASE=testdb;UID=sa;PWD=YourPassword' ) cursor = conn.cursor() cursor.execute("SELECT * FROM table_name") rows = cursor.fetchall()
在
connect
字符串中指定驱动、服务器地址(带端口)、数据库和登录凭据即可建立连接。之后同样使用cursor.execute()
和cursor.fetchall()
获取数据。 -
SQL Server (pymssql):安装
pip install pymssql
。示例:import pymssql conn = pymssql.connect( server='localhost', user='sa', password='YourPassword', database='testdb', port=1433, charset='utf8' ) cursor = conn.cursor() cursor.execute("SELECT * FROM table_name") data = cursor.fetchall()
pymssql.connect
的参数类似,上面代码给出了连接本机 1433 端口 SQL Server 的示例。取回数据同样使用游标的fetch
方法。 -
Flask-SQLAlchemy 配置:也可使用 SQLAlchemy ORM。示例配置:
from flask_sqlalchemy import SQLAlchemy app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:123456@localhost:3306/testdb' db = SQLAlchemy(app)
或连接 SQL Server:
app.config['SQLALCHEMY_DATABASE_URI'] = ( 'mssql+pyodbc://sa:YourPassword@localhost:1433/testdb?' 'driver=ODBC+Driver+17+for+SQL+Server' ) db = SQLAlchemy(app)
配置好之后,可直接使用
db.session.execute(...)
或 ORM 模型进行查询。以上连接字符串格式参考 SQLAlchemy 官方文档。
4. 常见问题与调试方法
- 网络与端口:首先确认数据库容器或服务已启动(
docker ps
、docker logs
)。检查端口映射或监听:容器需使用-p
参数映射端口,服务器需开放端口(Windows 防火墙、Linuxiptables
或云安全组)。连接时确保使用正确的主机地址和端口(本地可用localhost:端口
,远程用服务器 IP)。 - 权限问题:MySQL 默认禁止
root
远程登录,如有需要可设置环境变量MYSQL_ROOT_HOST=%
或为普通用户授权;也需确保提供的用户名和密码无误。SQL Server 默认启用sa
用户,密码须符合复杂度要求。出现“Access denied”或登录失败时,应检查用户权限、密码是否正确,以及数据库本身是否存在指定的库和表。 - 字符编码:若查询结果出现乱码,检查数据库和连接是否使用同一字符集。MySQL 常见需要在连接时指定
charset='utf8mb4'
以支持中文或特殊符号,并确保数据库表采用 UTF-8 编码。SQL Server 常用 NVARCHAR 存储 Unicode,PyODBC 及 pymssql 默认会自动处理 Unicode,如果有问题可尝试设置charset
参数或text_factory
(对 SQLite 有用)。 - 驱动和依赖:使用 PyODBC 时,确保服务器和客户端安装了相同版本的 ODBC 驱动。Linux 上用 PyODBC 时需要先安装
msodbcsql17
等包。pymssql 依赖freetds
库(Ubuntu 可sudo apt-get install freetds-bin freetds-dev
)。如果出现“Driver not found”或“模块错误”,一般是对应驱动未安装或版本不匹配。 - 调试建议:可使用命令行工具独立验证连接。比如用
mysql -h host -P port -u user -p
或sqlcmd -S server,port -U sa
等工具测试网络和凭据是否有效。查看错误信息:Connection refused
常为网络/端口问题,Access denied
为账号权限问题。利用docker logs
、数据库日志文件或开启 SQLAlchemy 的echo=True
都有助于排查问题。 - 其他注意事项:Docker 容器重启后未持久化数据,生产环境需使用数据卷(Volume)挂载数据库数据目录。确保操作系统时钟、时区一致,以避免时间戳或缓存失效问题。生产环境下还需考虑备份、安全配置(SSL/TLS 连接、最小化权限等)。
以上内容涵盖了在 Windows 和 Linux 环境下部署 SQL Server/MySQL,以及在 Flask 应用中连接和操作数据库的常见步骤与示例,初学者可根据本指南进行实践和调试。