safeLoad(); $dsn = sprintf( 'mysql:host=%s;port=%s;dbname=%s;charset=%s', $_ENV['DB_HOST'] ?? '127.0.0.1', $_ENV['DB_PORT'] ?? '3306', $_ENV['DB_DATABASE'] ?? '', $_ENV['DB_CHARSET'] ?? 'utf8mb4' ); $pdo = new PDO( $dsn, $_ENV['DB_USERNAME'] ?? '', $_ENV['DB_PASSWORD'] ?? '', [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, ] ); function hasTable(PDO $pdo, string $table): bool { $stmt = $pdo->prepare('SELECT COUNT(*) FROM information_schema.TABLES WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ?'); $stmt->execute([$table]); return (int)$stmt->fetchColumn() > 0; } function hasIndex(PDO $pdo, string $table, string $index): bool { $stmt = $pdo->prepare('SELECT COUNT(*) FROM information_schema.STATISTICS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ? AND INDEX_NAME = ?'); $stmt->execute([$table, $index]); return (int)$stmt->fetchColumn() > 0; } if (!hasTable($pdo, 'user_auths')) { $pdo->exec(<<<'SQL' CREATE TABLE user_auths ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, user_id BIGINT UNSIGNED NOT NULL, auth_type VARCHAR(32) NOT NULL, auth_open_id VARCHAR(128) NOT NULL DEFAULT '', auth_union_id VARCHAR(128) NOT NULL DEFAULT '', auth_key VARCHAR(128) NOT NULL DEFAULT '', auth_extra JSON NULL, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (id), UNIQUE KEY uk_user_auths_type_key (auth_type, auth_key), KEY idx_user_auths_user_id (user_id), KEY idx_user_auths_auth_union_id (auth_type, auth_union_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户认证映射' SQL); echo "CREATE_TABLE user_auths\n"; } elseif (!hasIndex($pdo, 'user_auths', 'idx_user_auths_auth_union_id')) { $pdo->exec('ALTER TABLE user_auths ADD KEY idx_user_auths_auth_union_id (auth_type, auth_union_id)'); echo "ADD_INDEX user_auths.idx_user_auths_auth_union_id\n"; } echo "SCHEMA_UPGRADE_OK\n";