Python在金融中的应用 · 第二部分

第八节:数据库、MySQL与Python连接

当数据从“一张作业表”变成“长期积累的客户、交易、授信和还款记录”时,只靠 Excel 会越来越困难。数据库的作用,是把数据结构化保存,并让 Python 能稳定、可重复地读取和写入数据。

1. 为什么需要数据库

Excel 很适合小规模整理和临时计算,但金融数据通常有三个特点:数据量会不断增加,数据表之间存在关系,数据访问需要权限控制。只要进入长期项目、多人协作或网页应用场景,就应该理解数据库。

为什么金融数据需要数据库
为什么金融数据需要数据库

继续只用 Excel 的风险

同一个客户可能在不同表中反复出现;文件版本可能混乱;多人同时修改容易冲突;数据权限很难细分;当数据超过几十万行时,筛选、计算和打开文件都会变慢。

数据库带来的变化

数据库把数据放进表中,每张表有清楚字段。可以用 SQL 查询需要的数据,用账号权限控制访问,用备份机制降低误删风险,用 Python 自动读取数据并继续分析。

简单判断:如果数据只用一次,可以先用 Excel;如果数据要持续积累、多人使用、反复查询,或者要支撑网页和应用,就应该使用数据库。

2. 先理解几个基本概念

数据库不神秘。可以把它先理解成“更规范、更可查询、更能多人协作的表格系统”。学习 MySQL 前,先掌握几个词。

概念直观理解小微信贷例子
数据库 database一组相关数据表的集合。inclusive_finance 数据库。
表 table一张结构化表格。客户表、贷款表、还款表、城市指数表。
字段 column表中的一列,代表一个变量。客户编号、行业、贷款金额、违约标记。
记录 row表中的一行,代表一个观测。某一个商户的一笔贷款记录。
主键 primary key能唯一识别一行记录的字段。customer_id 或 loan_id。
SQL操作数据库的查询语言。查询某城市某一年小微信贷平均额度。

3. 常用数据库速览

市面上的数据库很多,不需要一开始全部掌握。先理解它们各自解决什么问题:有的适合交易记录,有的适合本地小文件,有的适合文档数据,有的适合高速缓存,有的适合大规模分析。下面这些是学习和项目中经常会遇到的数据库。

MySQL

关系型数据库

最常见的开源关系型数据库之一,很多网站、业务系统和云数据库服务都支持。适合学习 SQL、表结构、用户权限和 Python 连接数据库。

官方站点

PostgreSQL

关系型数据库

功能强、扩展性好,适合更复杂的数据类型、地理空间数据和严肃业务系统。它和 MySQL 都使用 SQL,但在功能细节和生态上不同。

官方站点

SQLite

嵌入式数据库

不需要单独启动服务器,一个数据库就是一个文件。适合本地小项目、手机应用、桌面软件和课程练习,不适合多人同时写入的大型系统。

官方站点

MariaDB

关系型数据库

从 MySQL 生态发展而来,很多命令和使用习惯与 MySQL 接近。适合需要开源关系型数据库、并希望兼容 MySQL 使用经验的场景。

官方站点

MongoDB

文档型数据库

数据以类似 JSON 的文档保存,不强制每条记录都有完全相同的字段。适合内容系统、日志、半结构化数据和快速变化的数据结构。

官方站点

Redis

内存数据库 / 缓存

读写速度很快,常用于缓存、排行榜、会话、实时计数和简单消息队列。它不是替代 MySQL 的普通表格数据库,而是解决高频访问问题。

官方站点

SQL Server

商业关系型数据库

微软生态中的关系型数据库,常与 Windows Server、Azure、Power BI 和企业管理系统配合使用。适合了解企业级数据库场景。

官方文档

DuckDB

分析型嵌入式数据库

适合在本机或 Python 环境中直接分析 CSV、Parquet 等数据文件。可以把它理解为“面向数据分析的 SQLite”,很适合教学和数据探索。

官方站点

本课程以 MySQL 为主,因为它适合讲清楚“服务器、账号、数据库、表、SQL、Python 连接”这一整套工作流。SQLite 和 DuckDB 更适合本地分析;MongoDB、Redis、SQL Server 等可以作为扩展了解。

4. 一个最小 MySQL 表:小微信贷客户

先创建一个非常小的客户表。这个表只用于练习,字段包括客户编号、城市、行业、贷款金额、年利率和是否违约。

CREATE TABLE micro_loan_customers (
    customer_id INT PRIMARY KEY,
    city VARCHAR(50),
    industry VARCHAR(50),
    loan_amount DECIMAL(12, 2),
    annual_rate DECIMAL(5, 4),
    default_flag INT
);

这段 SQL 的意思是:创建一张名为 micro_loan_customers 的表。customer_id 是主键,每个客户只能有一个唯一编号。loan_amount 用于保存贷款金额,default_flag 用 0 或 1 表示是否违约。

INSERT INTO micro_loan_customers
(customer_id, city, industry, loan_amount, annual_rate, default_flag)
VALUES
(1, '杭州', '餐饮', 80000, 0.0580, 0),
(2, '宁波', '零售', 120000, 0.0620, 0),
(3, '温州', '制造', 200000, 0.0680, 1),
(4, '嘉兴', '物流', 150000, 0.0600, 0);

插入数据后,就可以查询。例如,查看所有客户,或者计算不同城市的平均贷款金额。

SELECT * FROM micro_loan_customers;

SELECT city, AVG(loan_amount) AS avg_loan
FROM micro_loan_customers
GROUP BY city;

5. 用 Python 连接 MySQL

Python 连接 MySQL 的基本思路是:安装驱动,准备连接信息,建立连接,执行 SQL,最后把结果读入 Pandas 做进一步分析。

Python 连接 MySQL 的基本流程
Python连接MySQL的基本流程
pip install pymysql pandas

下面是一段最小连接代码。实际使用时,不要把真实密码写进公开网页、公开仓库或截图中。这里用占位符表示。

import pymysql
import pandas as pd

connection = pymysql.connect(
    host="你的数据库地址",
    port=3306,
    user="你的用户名",
    password="你的密码",
    database="inclusive_finance",
    charset="utf8mb4"
)

sql = """
SELECT city, industry, loan_amount, annual_rate, default_flag
FROM micro_loan_customers
WHERE loan_amount >= 100000
"""

df = pd.read_sql(sql, connection)
print(df)

connection.close()

这段代码最重要的不是记住每个参数,而是理解每个参数的含义:host 是数据库服务器地址,port 通常是 3306,user 和 password 是账号密码,database 是要连接的数据库名称。

如果连接失败,先检查四件事:数据库是否启动;账号和密码是否正确;数据库名是否写对;如果是云数据库,是否设置了白名单或安全组。

6. 用 Python 写入数据

读取数据库只是第一步。很多实际项目中,还需要把清洗后的结果或模型输出写回数据库。下面示例插入一条新的客户记录。

import pymysql

connection = pymysql.connect(
    host="你的数据库地址",
    port=3306,
    user="你的用户名",
    password="你的密码",
    database="inclusive_finance",
    charset="utf8mb4"
)

sql = """
INSERT INTO micro_loan_customers
(customer_id, city, industry, loan_amount, annual_rate, default_flag)
VALUES (%s, %s, %s, %s, %s, %s)
"""

data = (5, "绍兴", "批发", 90000, 0.0610, 0)

with connection.cursor() as cursor:
    cursor.execute(sql, data)
    connection.commit()

connection.close()

这里的 %s 是参数占位符。不要用字符串拼接方式把用户输入直接拼进 SQL,因为那样容易出现 SQL 注入风险。虽然本节只是入门,但从一开始就要养成安全写法。

7. 练习环境怎么选择

练习 MySQL 有多种方式,不必所有同学都购买云服务。可以根据学习目的和成本选择。

MySQL 练习环境的三种选择
MySQL练习环境的三种选择
方案适合情况优点注意事项
阿里云 RDS MySQL希望练习云数据库、白名单、远程连接和数据库管理。托管服务,包含备份、监控、恢复等能力。会产生费用;购买页面和配置价格以官网实时显示为准。
阿里云轻量数据库服务轻量应用、开发测试、小型项目。面向轻量级应用,可与轻量应用服务器内网连接。官方文档显示支持 MySQL 5.7 和 MySQL 8.0;不同地域和套餐以购买页为准。
学院服务器 MySQL希望在统一环境中练习,不想自己安装。老师可以提供测试账号,便于统一演示。只用于课程练习,不要上传敏感数据;账号权限应限制在测试数据库内。
本机 MySQL希望完全在自己电脑上练习。成本低,适合反复试错。需要自行安装和配置;换电脑或重装系统时要注意备份。

8. 阿里云 MySQL 服务入口与购买思路

如果选择云端 MySQL,可以从阿里云官方页面开始。不要只看价格,也要看地域、版本、白名单、安全组、备份策略和是否需要公网访问。

  1. 选择地域。如果以后要和网站或服务器配合,数据库和服务器尽量放在同一地域,便于内网访问并降低延迟。
  2. 选择 MySQL 版本。初学练习优先选择常见版本,例如 MySQL 8.0;如果学院服务器已经提供版本,以老师提供环境为准。
  3. 创建数据库和账号。不要直接使用最高权限账号做日常练习。建议创建专门的课程账号,只能访问课程数据库。
  4. 配置访问控制。云数据库如果需要从本机连接,通常要配置白名单或安全组。不要把 3306 端口对所有公网地址开放。
  5. 保存连接信息。主机地址、端口、数据库名、用户名和密码要妥善保存,不要写进公开网页或 GitHub 仓库。

9. 学院服务器和本机安装的简单指导

使用学院服务器

老师可以提供现成 MySQL 测试库和账号。拿到账号后,只需要记录主机地址、端口、数据库名、用户名和密码。第一次连接时,先运行 SELECT 1;,确认能连通,再进入建表和查询练习。

学院服务器账号只用于课程练习。不要修改公共表,不要上传真实敏感数据,不要把账号密码发到公开群、网页或仓库。

在笔记本上安装 MySQL

本机安装适合反复练习。可以安装 MySQL Community Server,也可以使用 Docker 运行 MySQL。初学时建议先用图形化工具或命令行确认 MySQL 能启动,再让 Python 连接。

# 如果使用 Docker,可参考这样的练习命令
docker run --name mysql-course \
  -e MYSQL_ROOT_PASSWORD=course_password \
  -e MYSQL_DATABASE=inclusive_finance \
  -p 3306:3306 \
  -d mysql:8.0

安全要求:真实业务数据、个人信息、银行流水、客户联系方式等敏感数据不能放进公开练习环境。课程示例应使用合成数据或脱敏数据。

10. 本节练习

练习 A:设计一张表

为“小微商户贷款记录”设计一张表,至少包含贷款编号、客户编号、城市、行业、贷款金额、利率、是否违约和贷款年份。写出字段名和字段含义。

练习 B:写三条 SQL

写出三条查询:查看全部记录;筛选贷款金额大于 10 万元的记录;按照城市计算平均贷款金额。

练习 C:用 Python 读取

把查询结果读入 Pandas DataFrame,并打印前五行。观察列名、数据类型和金额单位是否符合预期。

练习 D:写出安全检查

列出连接云数据库前必须检查的事项:白名单、账号权限、密码保存位置、是否使用真实敏感数据。