You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

175 lines
5.0 KiB

3 months ago
// 直接连接数据库检查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();