ARTICLE DETAIL

资讯详情

深耕商务建站与企业官网运营的一线实战洞察。

从写死数据到连接真实数据库:SQLite到MySQL的入门实操指南

从写死数据到连接真实数据库:SQLite到MySQL的入门实操指南 1. 为什么想聊这个话题一千个“写死数据”的项目1.1 我见到太多“写死数据”的现场真的替他们着急先说说我最近的一次经历有个做运营平台的朋友拿项目给我看说他们小团队费了好大劲做了一个“客户管理页面”前端界面、登录判断、角色区分全都有了结果一点开用户列表——三个测试账号、两行假记录所有数据都直接写死在代码里。改一个手机号得先找到那段数组改完还要重新打包发布。我当时就问他你没有接数据库吗他愣了一下说“数据库不是得学很多东西吗我们几个都是文科生转过来的能把这个页面跑起来已经不容易了。”这句话我太熟悉了。这些年我看过太多类似的项目写死用户、写死订单、写死商品列表甚至有的连“今日新闻”都是早上手动替换的。不能说他们不认真只能说大家都把“连数据库”这件事想得太重总觉得那是资深后端工程师才能碰的领域。但事实完全不是这样。今天这个环境普通开发者、非科班转行的人要迈过“从写死数据到连接真实数据库”这一步门槛已经低到了非常友好的程度。甚至可以说一旦你掌握了这个切换你手里的项目就从“演示品”变成“真正能用起来的东西”。这不只是技术升级是整个项目性质的改变。1.2 “写死数据”到底死在哪我不反对在最早的原型阶段用写死数据。当年我自己做Demo的时候也这么干毕竟最快。但你要搞清楚它的问题是什么改动一次数据就要改代码改完还要重新构建、重新部署。你早上改了个价格客户下午看到的还是旧版你说这难受不难受。多个人一起用的时候各看各的版本。每个人都有一份自己的“假数据”谁都不知道哪个是准的。没有历史记录。数据被覆盖就被覆盖了回头找都没地方找。数据量一大前端页面直接卡死。你试试把一万条订单写死在JavaScript里浏览器直接吃内存。写死数据的本质是什么是把“数据”和“程序”捆死在了一起。真正靠谱的架构数据应该独立于程序存活程序停了数据还在版本升级了数据还能迁移换一个终端数据依然能查。这才叫“数据资产”写死在代码里的那些只能叫“临时变量”。2. 数据库到底解决了什么给数据一个“正规编制”2.1 千万别把数据库想成高深的技术它就是个“公共储物柜”很多人一听“数据库”三个字就自动联想到高薪DBA、复杂SQL调优、分布式架构其实对绝大部分项目来说数据库干的事情非常简单就是提供一个统一的地方让你把数据放进去、拿出来、改掉、删掉并且让别人也能跟你同步操作。我经常用一个比喻写死数据就像你自己兜里揣着所有物品别人要用你得掏出来递给他数据库就像一个小区里的公共储物柜人人都有钥匙你放进去别人按编号取谁也不会拿错里面还有登记册记录谁动过。这个“储物柜”解决了一个很关键的问题程序可以有多个实例服务可以重启但是数据是持久的、共享的、一致的。而这恰恰是企业级应用和“作业级Demo”最本质的区别。2.2 关系数据库最核心的三个概念表、行、列以及它们的主键连接真实数据库之前花十分钟搞懂三个概念就够了。表Table就是一类东西的集合比如用户表、订单表。行Row表里面的一条具体记录比如某个具体用户张三。列Column一条记录的一个属性比如用户名、手机号、注册时间。主键每行数据唯一的身份标识。就好比身份证号一张表里不能有两行完全相同的主键。搞懂这些之后再看SQL语句就一点都不吓人了。查询数据的语句核心就一句SELECT * FROM users WHERE name 张三;意思就是从“用户表”里把“姓名”这一列等于“张三”的所有行都拿出来。所有复杂的查询本质上都是在“哪张表”“取哪些列”“什么条件”这三个维度上做组合。2.3 什么时候该下定决心从写死切到真库我总结了一个“触发信号”满足任何一条你就别犹豫了数据要由多个用户、多个入口维护和查看数据量会持续增长比如记录每天都会新增同一个数据需要被多个功能模块复用上线之后需要有人在不碰代码的情况下修改内容。只要你的项目碰了上面任意一条“写死数据”就撑不住了。反过来讲如果你只是做一个单机的小玩具自己演示完就丢那继续写死也没问题。工具不丢人选错工具才麻烦。3. 动手实操把写死的数据搬到真实数据库3.1 第一步先选一个门槛最低、又足够真实用的数据库数据库选型这件事很多人一上来就被Oracle、SQL Server那些企业级名词劝退。其实我的建议非常明确先从 SQLite 开始只要你跑通流程再切到 MySQL 或者 PostgreSQL 会非常顺。SQLite 强在哪它是一个单文件数据库不需要安装服务端、不需要配置端口、不需要账号密码就是一个“.db”文件。你的程序读写这个文件数据就持久化了。对于学习“连接数据库”这件事来说它把所有的外部噪音都剔除了。不过如果你要做的项目将来要真实部署给别人用、有并发访问我更推荐直接上 PostgreSQL 或者 MySQL。这俩的区别对新手来说没那么重要你只需要知道PostgreSQL 功能更丰富一些对复杂查询和事务支持更严谨MySQL 使用人群广教程多排障容易。我的习惯是个人项目用 PostgreSQL团队协作时看大家更熟哪个。以MySQL为例建库建表的常用命令你可以直接抄CREATE DATABASE shop CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; USE shop; CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50) NOT NULL, phone VARCHAR(20), created_at DATETIME DEFAULT CURRENT_TIMESTAMP );注意这里的utf8mb4和utf8mb4_unicode_ci这是给中文数据用的能避免绝大多数乱码问题。后面我会专门再讲这个坑。3.2 第二步写一条稳定的“连接通道”而不是每次现连连接数据库最忌讳什么就是每要执行一次查询就现写一段连接代码、用完就断开。连接本身是有开销的频繁开关连接在高并发场景下会把数据库拖死。正确姿势是把这个连接过程封装成一个固定的“通道层”。我用Python举例因为非科班转行的朋友大多会选Python语法没有压迫感。import pymysql from dbutils.pooled_db import PooledDB DB_CONFIG { host: 127.0.0.1, port: 3306, user: shop_user, password: your_password, database: shop, charset: utf8mb4 } pool PooledDB(creatorpymysql, maxconnections10, **DB_CONFIG) def get_conn(): return pool.connection()用连接池之后每次要操作数据就调用get_conn()借一条连接用完归还。这样既不会把连接用完不还也不会每次都重复握手。学名叫做“数据库连接池”听起来很高级本质就是一个帮你管理连接的工具箱。3.3 第三步把增删改查封装成服务业务代码里别裸奔SQL很多新手容易犯的第二个错是在页面逻辑里直接拼SQL字符串。这样不但代码四处重复更危险的是容易出安全问题。你应该把对每张表的操作收敛到一个文件里起个名字叫“数据访问层”。比如用户模块你就封装四个函数def get_user(user_id): ... def create_user(name, phone): ... def update_user(user_id, name, phone): ... def delete_user(user_id): ...业务代码里只调用这些函数不再关心SQL长什么样。这不是什么高深的架构思想纯粹是为了让你的代码好维护、好测试、好替换。数据库同步软件、数据库导出脚本这些工具将来要接进来的时候也都以这个层为边界。另一个很重要的点所有涉及用户输入的地方绝对不要用拼接字符串的方式写SQL。要使用参数化查询。你只要记住一个铁律外部来的内容永远只作为一个“值”传进去永远不要变成SQL语句的一部分。这是你项目上线之后不被搞垮的底线之一。4. 连接真实数据库后的关键细节从能跑到能用的距离4.1 事务要么全成要么全不成企业级项目和Demo之间有一道分水岭叫“事务”。举个例子一个下单流程扣库存、减余额、生成订单、记录日志。如果其中一步失败了前面已经执行的操作必须全部回滚否则就会出现“钱扣了但订单没创建”的脏数据。SQLite、MySQL、PostgreSQL都支持事务。核心语法就是三条START TRANSACTION; UPDATE ...; INSERT ...; COMMIT;当遇到异常时执行ROLLBACK;就回到事务开始前的状态。你在封装数据访问函数时要把多个操作放进同一个事务里管理而不是每个SQL各自独立提交。这个习惯是你未来写任何带金钱、库存、状态的业务都绕不开的。事务之外还要理解“并发”这个词。你项目上线后同一时间可能有成百上千个人操作。两个用户同时抢最后一个库存数据库怎么保证不超卖这就靠事务隔离级别和行锁来处理。对刚入门的人来说你不需要一开始就精通但至少要知道MySQL默认的REPEATABLE READ隔离级别在绝大多数业务场景下是安全可用的别没事去“优化”成其他级别。4.2 权限管理别用root账号跑业务该建就建专号这个坑我见过太多次开发的时候图省事全流程都用root或者管理员账号然后项目要上线了用户名密码还写死在配置里。一旦泄露别人就能把你的用户表删得干干净净。正确做法是为每个项目创建专用账号并授予最小权限。还是以MySQL为例CREATE USER shop_user% IDENTIFIED BY a_strong_password; GRANT SELECT, INSERT, UPDATE, DELETE ON shop.* TO shop_user%; FLUSH PRIVILEGES;你就给增删改查四个权限就够了绝对不要给DROP、ALTER这类危险权限给业务账号。万一将来真出了安全事故损失的也是一部分数据而不是整个库。谁会负责修复这些说实话并不重要重要的是你自己别把大门钥匙交出去。4.3 千万别忽视备份数据是你项目唯一的“不动产”代码丢失了可以从Git仓库拉回来数据丢了就真没了。企业级项目意识里备份不是可选项是必需项。我建议至少做到两条每天定时自动备份一次备份文件保留至少7天每次做批量更新、删除、表结构变更之前手动手动备份一次。MySQL的备份命令很简单mysqldump -u shop_user -p shop backup_$(date %F).sql恢复也不复杂mysql -u shop_user -p shop backup_2025-01-01.sqlPostgreSQL对应的是pg_dump和psql用法差不多。这件事前期花的心思极少但真到出问题时你会觉得它是你做过最值的一个决定。5. 文科生/非科班最容易栽的五个跟头5.1 表结构设计时的“拍脑袋”陷阱非科班同学做表结构最常见的问题就是把Excel的习惯搬到数据库。Excel里你可以一张表放所有信息数据库不行或者说最好不要。比如你要做订单系统列里塞“客户姓名、客户电话、客户地址”看起来方便但从第二笔订单开始你就会发现同一客户在不同订单里重复填了三遍改一个地址要改好几行。这叫做“数据冗余”。解决办法是拆表客户一张表订单一张表订单里只放“客户ID”。想要查订单对应的客户信息时用关联查询把两张表连起来。这个过程叫“规范化设计”说人话就是数据尽量只存一处其他地方只存它的ID。一开始别追求高深的第三范式你就记住“同一件事不重复存”这一条原则就已经能避开一大半设计错误。5.2 改数据前的备份与“先查后改”习惯我见过一个让人哭笑不得的事故有人写了个更新语句忘了加WHERE条件结果把全表所有订单的金额都改成了一个数。这种事资深工程师也会遇到但老手和非新手的区别在于——敢不敢在没备份的情况下执行。所以给你一个我用了很多年的铁律任何修改类语句先写成SELECT跑一遍确认影响的行数是你预期的再把它改写成UPDATE执行。执行前保留一句备份哪怕就是导出一份CSV也好。这多出来的两分钟能救你无数次。5.3 中文乱码的罪魁祸首字符集不一致“为什么我存进去的是中文查出来是问号”这个问题我回答了无数次。绝大多数原因是创建数据库时用了默认字符集通常在Linux环境下是latin1或utf8但有些老版本连utf8都不完整而程序连接时用的是utf8mb4。你只要从建库开始就统一三处字符集就不会有乱码问题数据库本身CREATE DATABASE ... CHARACTER SET utf8mb4表本身CREATE TABLE ... DEFAULT CHARSETutf8mb4连接参数charsetutf8mb4三处一致中文随便存。另外老项目要是已经变成乱码了不要指望“改个配置”能让旧数据自己恢复乱码往往是不可逆的你只能修复新数据旧数据得靠备份恢复。5.4 索引与慢查询数据多了以后你们家系统变慢的原因项目刚上线数据几十条查询飞快。半年后数据量上万、上十万页面开始转圈SQL开始慢。这种情况90%是因为该加索引的地方没加。索引是什么你可以把它理解成书后面的目录。没有目录你要找“卖冰箱的订单”只能从第一页翻到最后一页这叫做“全表扫描”。加了索引数据库直接跳到对应的那一块区域速度自然快。常见的加索引场景是经常出现在WHERE后面的字段、经常用于排序的字段、以及外键字段。例如上面说的订单表里customer_id就应该加索引ALTER TABLE orders ADD INDEX idx_customer_id (customer_id);有一点要提醒你索引不是越多越好。每加一个索引写入数据时都要额外维护一份“目录”反而拖慢插入速度。只给真正查询用的关键字段加索引就够了。5.5 连接泄漏程序一会儿正常一会儿卡死八成是这个原因还有一种很常见的诡异故障程序刚启动时一切正常跑一段时间后突然变慢甚至报“too many connections”。重启之后又好了过一会儿又犯病。这通常不是数据库的问题而是你代码里拿连接后没归还。如果你用的是连接池每次用完一定要把连接放回池里。Python里用with语句可以保证这一点with get_conn() as conn: cursor conn.cursor() cursor.execute(SELECT * FROM users)这样无论中途有没有报错连接都会自动归还。一个小细节能让你的项目稳定性和专业感提升一个档次。6. 我的真实体会连接真库不是技术升级是思维升级做这行越久我越觉得从“写死数据”到“连接真实数据库”最难的从来不是SQL语法、不是安装数据库软件而是思维方式的转变。写死数据的时候你的脑子里只有“程序”连接到真实数据库之后你的世界里多了一个长线存在的“数据实体”。它会逼着你考虑数据怎么组织才合理、别人怎么访问、权限怎么隔离、坏数据怎么防、丢了怎么恢复、并发冲突怎么处理。这些东西看起来很多但每解决一个你手里的项目就向“企业级”靠近一点。这么多年我带过的人里有些确实是文科生出身但他们现在维护的系统服务着上万人。他们唯一的共同点就是敢在那个“看起来门槛很高”的地方迈出第一步。最后分享一个小习惯我给自己的学习项目设了一个规则凡是会重复看、需要跟别人同步的信息一律不写死在代码里。哪怕只是一个备忘录列表我也宁愿丢进SQLite文件里。这样每一次练习都是在提前熟悉真实项目的操作流。等哪天真的要上一个大系统你不会觉得“连接数据库”是你需要准备的技能它早就是你习以为常的一部分了。
返回列表
PREV
查看更多资讯
NEXT
返回资讯列表