// 直接连接数据库检查productQuantity字段的脚本 const Sequelize = require('sequelize'); const mysql = require('mysql2/promise'); // 数据库连接配置 const sequelize = new Sequelize( 'minishop', // 数据库名 'root', // 用户名 'password', // 密码 { host: 'localhost', dialect: 'mysql', pool: { max: 5, min: 0, acquire: 30000, idle: 10000 }, timezone: '+08:00' // 设置时区为UTC+8 } ); // 定义购物车模型 - 直接复制自server-mysql.js class CartItem extends Sequelize.Model {} CartItem.init({ id: { type: Sequelize.DataTypes.INTEGER, autoIncrement: true, primaryKey: true }, userId: { type: Sequelize.DataTypes.STRING(100), allowNull: false }, productId: { type: Sequelize.DataTypes.STRING(100), allowNull: false }, productName: { type: Sequelize.DataTypes.STRING(255), allowNull: false }, specification: { type: Sequelize.DataTypes.STRING(255) }, quantity: { type: Sequelize.DataTypes.INTEGER, allowNull: false, defaultValue: 1 }, productQuantity: { type: Sequelize.DataTypes.INTEGER, allowNull: false, defaultValue: 0 }, grossWeight: { type: Sequelize.DataTypes.DECIMAL(10, 2) }, yolk: { type: Sequelize.DataTypes.STRING(100) }, price: { type: Sequelize.DataTypes.DECIMAL(10, 2) }, selected: { type: Sequelize.DataTypes.BOOLEAN, defaultValue: true }, added_at: { type: Sequelize.DataTypes.DATE, defaultValue: Sequelize.NOW } }, { sequelize, modelName: 'CartItem', tableName: 'cart_items', timestamps: false }); // 检查数据库结构 async function checkDatabaseStructure() { console.log('开始直接检查数据库中的productQuantity字段...'); try { // 检查连接 await sequelize.authenticate(); console.log('✅ 数据库连接成功'); // 1. 使用原始查询检查表结构 console.log('\n1. 检查cart_items表结构...'); const [fields, _] = await sequelize.query('DESCRIBE cart_items'); // 查找productQuantity字段 const productQuantityField = fields.find(field => field.Field === 'productQuantity'); if (productQuantityField) { console.log('✅ 数据库中存在productQuantity字段:'); console.log(` - 类型: ${productQuantityField.Type}`); console.log(` - 是否允许NULL: ${productQuantityField.Null === 'YES' ? '是' : '否'}`); console.log(` - 默认值: ${productQuantityField.Default || '无'}`); } else { console.error('❌ 数据库中不存在productQuantity字段!'); console.log('cart_items表中的所有字段:', fields.map(field => field.Field).join(', ')); // 如果不存在,尝试添加这个字段 console.log('\n尝试添加productQuantity字段到cart_items表...'); try { await sequelize.query('ALTER TABLE cart_items ADD COLUMN productQuantity INT NOT NULL DEFAULT 0'); console.log('✅ 成功添加productQuantity字段'); } catch (addError) { console.error('❌ 添加字段失败:', addError.message); } } // 2. 检查test_user_id的购物车数据 console.log('\n2. 检查测试用户的购物车数据...'); const cartItems = await CartItem.findAll({ where: { userId: 'test_user_id' }, // 明确指定返回所有字段 attributes: { exclude: [] // 不排除任何字段 } }); console.log(`找到 ${cartItems.length} 条购物车记录`); if (cartItems.length > 0) { // 显示第一条记录的所有字段 console.log('\n第一条购物车记录的所有字段:'); const firstItem = cartItems[0].toJSON(); Object.keys(firstItem).forEach(key => { console.log(` - ${key}: ${firstItem[key]}`); }); // 特别检查productQuantity字段 console.log('\nproductQuantity字段在数据中的状态:'); cartItems.forEach((item, index) => { const data = item.toJSON(); console.log(` 记录 ${index + 1}: productQuantity = ${data.productQuantity !== undefined ? data.productQuantity : 'undefined'}`); }); } // 3. 尝试直接插入一条带productQuantity的记录 console.log('\n3. 尝试直接插入一条带productQuantity的记录...'); const testProductId = 'db_test_' + Date.now(); const newItem = await CartItem.create({ userId: 'test_user_id', productId: testProductId, productName: '数据库测试商品', specification: '测试规格', quantity: 2, productQuantity: 10, grossWeight: 1000, yolk: '测试蛋黄', price: 50, selected: true, added_at: new Date() }); console.log('✅ 成功插入记录'); console.log('插入的记录详情:', newItem.toJSON()); } catch (error) { console.error('检查过程中发生错误:', error.message); } finally { // 关闭连接 await sequelize.close(); console.log('\n数据库连接已关闭'); } } // 执行检查 checkDatabaseStructure();