| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788 |
- /**
- * Add lobster_user_profile.channel_type (and related index) if missing.
- * Usage: node scripts/repair-lobster-profile-schema.js [dbName]
- */
- const mysql = require('mysql2/promise')
- const DB_CFG = {
- host: 'cq-cdb-8fjmemkb.sql.tencentcdb.com',
- port: 27220,
- user: 'root',
- password: 'Ylrz_1q2w3e4r5t6y',
- charset: 'utf8mb4',
- multipleStatements: true
- }
- const TARGET_DB = process.argv[2] || 'fs_tenant_cs1'
- async function columnExists(conn, table, column) {
- const [rows] = await conn.query(
- `SELECT COUNT(*) c FROM INFORMATION_SCHEMA.COLUMNS
- WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ? AND COLUMN_NAME = ?`,
- [table, column]
- )
- return rows[0].c > 0
- }
- async function indexExists(conn, table, indexName) {
- const [rows] = await conn.query(
- `SELECT COUNT(*) c FROM INFORMATION_SCHEMA.STATISTICS
- WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ? AND INDEX_NAME = ?`,
- [table, indexName]
- )
- return rows[0].c > 0
- }
- async function repair(conn) {
- const [tables] = await conn.query(`SHOW TABLES LIKE 'lobster_user_profile'`)
- if (!tables.length) {
- console.log('skip: lobster_user_profile table not found')
- return
- }
- const hasChannel = await columnExists(conn, 'lobster_user_profile', 'channel_type')
- if (!hasChannel) {
- await conn.query(`
- ALTER TABLE lobster_user_profile
- ADD COLUMN channel_type varchar(20) NOT NULL DEFAULT 'QW' COMMENT 'channel type QW/WX/IM'
- AFTER external_user_id
- `)
- console.log('added column channel_type')
- } else {
- console.log('column channel_type already exists')
- }
- if (await indexExists(conn, 'lobster_user_profile', 'uk_user')) {
- const [idx] = await conn.query(`SHOW INDEX FROM lobster_user_profile WHERE Key_name = 'uk_user'`)
- const cols = idx.map(r => r.Column_name).join(',')
- if (cols === 'company_id,external_user_id' || cols === 'company_id,external_user_id,') {
- await conn.query('ALTER TABLE lobster_user_profile DROP INDEX uk_user')
- console.log('dropped old uk_user')
- }
- }
- if (!(await indexExists(conn, 'lobster_user_profile', 'uk_user'))) {
- await conn.query(`
- ALTER TABLE lobster_user_profile
- ADD UNIQUE KEY uk_user (company_id, channel_type, external_user_id)
- `)
- console.log('added uk_user (company_id, channel_type, external_user_id)')
- } else {
- console.log('index uk_user already ok')
- }
- }
- async function main() {
- const conn = await mysql.createConnection({ ...DB_CFG, database: TARGET_DB })
- console.log('DB:', TARGET_DB)
- await repair(conn)
- const [cols] = await conn.query(
- `SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS
- WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'lobster_user_profile'
- ORDER BY ORDINAL_POSITION`
- )
- console.log('columns:', cols.map(r => r.COLUMN_NAME).join(', '))
- await conn.end()
- }
- main().catch(e => { console.error(e); process.exit(1) })
|