You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将用户输入的JSON餐厅数据拆分后逐条存入MySQL数据库?

你的需求完全可以实现,属于非常基础的数据库多记录插入场景,学习阶段也可以快速完成开发。

第一步:调整MySQL表结构

首先优化存储结构,建议拆分两张表符合数据库设计规范,避免数据冗余:

  • user_info 表:存储用户个人基础信息,字段包含user_id(主键)、姓名、手机号等你需要的用户字段
  • user_restaurant 表:存储用户选择的餐厅,每个餐厅单独存一条,字段包含id(自增主键,可选)、user_id(关联user_info表的user_id,非空)、restaurant_name(单个餐厅名称,非空)
第二步:Python API端核心处理逻辑

假设你用Flask框架开发API(用FastAPI、Django等其他框架的核心逻辑完全一致,仅接收请求的语法有区别),核心处理流程如下:

  • 首先接收并解析Postman提交的JSON数据,建议约定的JSON格式参考:
{
  "user_id": 1,
  "user_name": "张三",
  "phone": "13xxxxxxxxx",
  "restaurant_list": ["RestA", "Restb", "Restc"]
}
  • 先处理用户基础信息的新增/更新,避免重复存储用户数据
  • 遍历restaurant_list中的每一个餐厅名称,用参数化查询批量插入到user_restaurant表中,参考代码如下:
import pymysql
from flask import Flask, request

app = Flask(__name__)
# 替换为你自己的数据库连接配置
db_config = {
    "host": "127.0.0.1",
    "user": "root",
    "password": "你的数据库密码",
    "database": "你的库名",
    "charset": "utf8mb4"
}

@app.route('/submit_restaurant', methods=['POST'])
def submit_restaurant():
    # 解析JSON请求参数
    req_data = request.get_json()
    # 基础参数校验
    if not req_data.get("user_id") or not req_data.get("restaurant_list"):
        return {"code": 400, "msg": "缺少必填参数"}
    rest_list = req_data["restaurant_list"]
    if len(rest_list) <5 or len(rest_list) >10:
        return {"code": 400, "msg": "餐厅数量需要在5-10个之间"}
    
    conn = pymysql.connect(**db_config)
    cursor = conn.cursor()
    try:
        # 可选:如果用户重复提交需要覆盖旧数据,先删除该用户之前的餐厅记录
        # cursor.execute("DELETE FROM user_restaurant WHERE user_id = %s", req_data["user_id"])
        
        # 批量插入新的餐厅记录
        insert_sql = "INSERT INTO user_restaurant(user_id, restaurant_name) VALUES (%s, %s)"
        insert_params = [(req_data["user_id"], rest.strip()) for rest in rest_list if rest.strip()]
        cursor.executemany(insert_sql, insert_params)
        
        conn.commit()
        return {"code": 200, "msg": "提交成功", "insert_count": len(insert_params)}
    except Exception as e:
        conn.rollback()
        return {"code": 500, "msg": f"操作失败: {str(e)}"}
    finally:
        cursor.close()
        conn.close()

if __name__ == '__main__':
    app.run(port=5000, debug=True)
注意事项
  • 代码中用到了参数化查询,可以规避SQL注入风险,不要直接拼接SQL字符串执行
  • 已经内置了餐厅数量的校验逻辑,不符合数量要求会直接返回错误提示
  • 如果需要支持用户修改提交的内容,把代码中删除旧记录的注释打开即可,实现新提交内容覆盖旧内容的效果

内容的提问来源于stack exchange,提问作者Robotboy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 14:39:03