diff --git a/extend/base/common/service/scheme/DbToSchemeService.php b/extend/base/common/service/scheme/DbToSchemeService.php index 5b45be9..47b6a7a 100644 --- a/extend/base/common/service/scheme/DbToSchemeService.php +++ b/extend/base/common/service/scheme/DbToSchemeService.php @@ -57,17 +57,32 @@ class DbToSchemeService protected function getTableComment($tableName): string { - // 简单适配 MySQL - try { - $config = Config::get('database.connections.' . $this->connection); - $database = $config['database']; - // 暂时只支持MySQL的表注释获取,其他返回空 - $sql = "SELECT table_comment FROM information_schema.TABLES WHERE table_schema = ? AND table_name = ?"; - $res = Db::connect($this->connection)->query($sql, [$database, $tableName]); - return $res[0]['table_comment'] ?? ''; - } catch (\Exception $e) { + $type = strtolower((string)Config::get('database.connections.' . $this->connection . '.type', '')); + if ($type !== 'mysql') { return ''; } + + try { + $escaped = addcslashes($tableName, "\\_%"); + $rows = Db::connect($this->connection)->query("SHOW TABLE STATUS LIKE '$escaped'"); + if (!empty($rows)) { + return isset($rows[0]['Comment']) ? (string)$rows[0]['Comment'] : ''; + } + } catch (\Exception $e) { + } + + try { + $rows = Db::connect($this->connection)->query("SHOW CREATE TABLE `$tableName`"); + if (!empty($rows)) { + $create = $rows[0]['Create Table'] ?? ''; + if ($create !== '' && preg_match("/COMMENT='(.*?)'/s", $create, $matches)) { + return stripcslashes($matches[1]); + } + } + } catch (\Exception $e) { + } + + return ''; } protected function getTableIndices($tableName): array diff --git a/extend/base/common/service/scheme/SchemeToDbService.php b/extend/base/common/service/scheme/SchemeToDbService.php index 6ee495f..5905a39 100644 --- a/extend/base/common/service/scheme/SchemeToDbService.php +++ b/extend/base/common/service/scheme/SchemeToDbService.php @@ -616,22 +616,36 @@ class SchemeToDbService protected function diffTableComment(string $connection, string $tableName, string $schemeComment): ?string { - $database = (string)Config::get('database.connections.' . $connection . '.database', ''); - if ($database === '') { + $type = strtolower((string)Config::get('database.connections.' . $connection . '.type', '')); + if ($type !== 'mysql') { return null; } + $dbComment = ''; try { - $rows = Db::connect($connection)->query( - 'SELECT table_comment FROM information_schema.TABLES WHERE table_schema = ? AND table_name = ? LIMIT 1', - [$database, $tableName] - ); - $dbComment = isset($rows[0]['table_comment']) ? (string)$rows[0]['table_comment'] : ''; - if ($dbComment !== (string)$schemeComment) { - return "表注释不一致:DB={$dbComment} Scheme={$schemeComment}"; + $escaped = addcslashes($tableName, "\\_%"); + $rows = Db::connect($connection)->query("SHOW TABLE STATUS LIKE '$escaped'"); + if (!empty($rows)) { + $dbComment = isset($rows[0]['Comment']) ? (string)$rows[0]['Comment'] : ''; } } catch (\Throwable $e) { - return null; + } + + if ($dbComment === '') { + try { + $rows = Db::connect($connection)->query("SHOW CREATE TABLE `$tableName`"); + if (!empty($rows)) { + $create = $rows[0]['Create Table'] ?? ''; + if ($create !== '' && preg_match("/COMMENT='(.*?)'/s", $create, $matches)) { + $dbComment = stripcslashes($matches[1]); + } + } + } catch (\Throwable $e) { + } + } + + if ($dbComment !== (string)$schemeComment) { + return "表注释不一致:DB={$dbComment} Scheme={$schemeComment}"; } return null;