mirror of
https://gitee.com/ulthon/ulthon_admin.git
synced 2026-07-09 03:22:51 +08:00
fix(scheme): 改进MySQL表注释获取与对比的可靠性
This commit is contained in:
@@ -57,17 +57,32 @@ class DbToSchemeService
|
|||||||
|
|
||||||
protected function getTableComment($tableName): string
|
protected function getTableComment($tableName): string
|
||||||
{
|
{
|
||||||
// 简单适配 MySQL
|
$type = strtolower((string)Config::get('database.connections.' . $this->connection . '.type', ''));
|
||||||
try {
|
if ($type !== 'mysql') {
|
||||||
$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) {
|
|
||||||
return '';
|
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
|
protected function getTableIndices($tableName): array
|
||||||
|
|||||||
@@ -616,22 +616,36 @@ class SchemeToDbService
|
|||||||
|
|
||||||
protected function diffTableComment(string $connection, string $tableName, string $schemeComment): ?string
|
protected function diffTableComment(string $connection, string $tableName, string $schemeComment): ?string
|
||||||
{
|
{
|
||||||
$database = (string)Config::get('database.connections.' . $connection . '.database', '');
|
$type = strtolower((string)Config::get('database.connections.' . $connection . '.type', ''));
|
||||||
if ($database === '') {
|
if ($type !== 'mysql') {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$dbComment = '';
|
||||||
try {
|
try {
|
||||||
$rows = Db::connect($connection)->query(
|
$escaped = addcslashes($tableName, "\\_%");
|
||||||
'SELECT table_comment FROM information_schema.TABLES WHERE table_schema = ? AND table_name = ? LIMIT 1',
|
$rows = Db::connect($connection)->query("SHOW TABLE STATUS LIKE '$escaped'");
|
||||||
[$database, $tableName]
|
if (!empty($rows)) {
|
||||||
);
|
$dbComment = isset($rows[0]['Comment']) ? (string)$rows[0]['Comment'] : '';
|
||||||
$dbComment = isset($rows[0]['table_comment']) ? (string)$rows[0]['table_comment'] : '';
|
|
||||||
if ($dbComment !== (string)$schemeComment) {
|
|
||||||
return "表注释不一致:DB={$dbComment} Scheme={$schemeComment}";
|
|
||||||
}
|
}
|
||||||
} catch (\Throwable $e) {
|
} 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;
|
return null;
|
||||||
|
|||||||
Reference in New Issue
Block a user