如何更新动态数据表?个人选课项目场景下技术实现咨询
嘿,针对你这个个人课程管理项目的需求,我整理了一套直接落地的实现方案,完全贴合你说的不用考虑生产环境、SQL注入的前提——毕竟咱个人项目就是怎么简单怎么来!
核心逻辑梳理
先对齐下你当前的思路:
- 用户账户信息存在
Users表,用户名存全局变量 - 复制107行的主课程表,生成以用户名为名的专属课程表
- 支持用户标记已修课程并查看
具体实现代码(以Python+SQLite为例,轻量适合个人项目)
1. 基础表创建
先搞定用户表和主课程表的SQL语句:
-- 用户表:存储账户信息 CREATE TABLE IF NOT EXISTS Users ( username TEXT PRIMARY KEY, -- 用户名做主键,避免重复注册 password TEXT NOT NULL ); -- 主课程表:存储所有107门课程的基础信息 CREATE TABLE IF NOT EXISTS MainCourses ( course_id INTEGER PRIMARY KEY AUTOINCREMENT, course_name TEXT NOT NULL, credit REAL NOT NULL, description TEXT DEFAULT '' -- 可选字段,存课程简介 );
2. 生成用户专属课程表
这一步就是把主表的结构+数据复制到用户专属表,再加个标记已修的字段:
import sqlite3 def create_user_course_table(username): # 连接数据库(个人项目用SQLite文件数据库就行,不用装服务) conn = sqlite3.connect('course_manager.db') cursor = conn.cursor() # 复制主表的结构和数据到用户专属表 cursor.execute(f""" CREATE TABLE IF NOT EXISTS `{username}_courses` AS SELECT * FROM MainCourses; """) # 新增is_completed字段:0=未修,1=已修,默认0 cursor.execute(f""" ALTER TABLE `{username}_courses` ADD COLUMN is_completed INTEGER DEFAULT 0; """) conn.commit() conn.close()
3. 标记已修课程
给用户提供标记课程完成的功能:
def mark_course_as_completed(username, course_id): conn = sqlite3.connect('course_manager.db') cursor = conn.cursor() # 更新对应课程的已修状态 cursor.execute(f""" UPDATE `{username}_courses` SET is_completed = 1 WHERE course_id = ?; """, (course_id,)) conn.commit() conn.close()
4. 查询已修课程
让用户能查看自己已经完成的课程:
def get_user_completed_courses(username): conn = sqlite3.connect('course_manager.db') cursor = conn.cursor() # 查询所有已修的课程,返回课程名和学分 cursor.execute(f""" SELECT course_name, credit FROM `{username}_courses` WHERE is_completed = 1; """) completed_courses = cursor.fetchall() conn.close() return completed_courses
个人项目专属小优化(不用折腾复杂逻辑)
- 给
Users表加个created_at字段,记录用户注册时间,自己看数据更清晰:created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP - 专属表可以加个前缀比如
user_,比如user_john_courses,避免和其他系统表重名,看着也更规整 - 如果后续主课程表要加新课程,个人项目直接写个循环同步的小函数就行,毕竟用户数少,不用考虑性能问题
划重点:因为你明确说是个人项目,不用考虑SQL注入,所以直接用字符串格式化表名完全没问题——要是生产环境这么写绝对踩坑,但咱自己用就放心造!
内容的提问来源于stack exchange,提问作者tryingtotryhard
相关产品推荐
相关产品推荐

