Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

MySQL数据字典结果增加排序 #2745

Merged
merged 18 commits into from
Jul 31, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 3 additions & 4 deletions sql/engines/mysql.py
Original file line number Diff line number Diff line change
Expand Up @@ -297,9 +297,7 @@ def get_table_index_data(self, db_name, tb_name, **kwargs):

def get_tables_metas_data(self, db_name, **kwargs):
"""获取数据库所有表格信息,用作数据字典导出接口"""
sql_tbs = (
f"SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA=%(db_name)s;"
)
sql_tbs = f"SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA=%(db_name)s ORDER BY TABLE_SCHEMA,TABLE_NAME;"
tbs = self.query(
sql=sql_tbs,
cursorclass=MySQLdb.cursors.DictCursor,
Expand All @@ -321,7 +319,8 @@ def get_tables_metas_data(self, db_name, **kwargs):
_meta["ENGINE_KEYS"] = engine_keys
_meta["TABLE_INFO"] = tb
sql_cols = f"""SELECT * FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA='{tb['TABLE_SCHEMA']}' AND TABLE_NAME='{tb['TABLE_NAME']}';"""
WHERE TABLE_SCHEMA='{tb['TABLE_SCHEMA']}' AND TABLE_NAME='{tb['TABLE_NAME']}'
ORDER BY TABLE_SCHEMA,TABLE_NAME,ORDINAL_POSITION;"""
_meta["COLUMNS"] = self.query(
sql=sql_cols, cursorclass=MySQLdb.cursors.DictCursor, close_conn=False
).rows
Expand Down
80 changes: 80 additions & 0 deletions sql/engines/test_mysql.py
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,86 @@ def testQuery(self, connect):
connect.return_value.close.assert_called_once()
self.assertIsInstance(query_result, ResultSet)

@patch("MySQLdb.connect")
def test_get_tables_metas_data(self, connect):
"""增加单元测试方法。test_get_tables_metas_data"""
mock_conn = Mock()
mock_cursor = Mock()
connect.return_value = mock_conn
mock_conn.cursor.return_value = mock_cursor

# 模拟查询结果
tables_result = [{"TABLE_SCHEMA": "test_db", "TABLE_NAME": "test_table"}]

columns_result = [
{
"COLUMN_NAME": "id",
"COLUMN_TYPE": "int",
"COLUMN_DEFAULT": None,
"IS_NULLABLE": "NO",
"EXTRA": "auto_increment",
"COLUMN_KEY": "PRI",
"COLUMN_COMMENT": "",
},
{
"COLUMN_NAME": "name",
"COLUMN_TYPE": "varchar(255)",
"COLUMN_DEFAULT": None,
"IS_NULLABLE": "YES",
"EXTRA": "",
"COLUMN_KEY": "",
"COLUMN_COMMENT": "",
},
]
# 创建要测试的类的实例
new_engine = MysqlEngine(instance=self.ins1)
# Mock self.query 方法
new_engine.query = Mock()
new_engine.query.side_effect = [
Mock(rows=tables_result), # 模拟 tbs 结果
Mock(rows=columns_result), # 模拟 columns 结果
]
# 调用要测试的方法
result = new_engine.get_tables_metas_data(db_name="test_db")

# 断言返回结果是否符合预期
expected_result = [
{
"ENGINE_KEYS": [
{"key": "COLUMN_NAME", "value": "字段名"},
{"key": "COLUMN_TYPE", "value": "数据类型"},
{"key": "COLUMN_DEFAULT", "value": "默认值"},
{"key": "IS_NULLABLE", "value": "允许非空"},
{"key": "EXTRA", "value": "自动递增"},
{"key": "COLUMN_KEY", "value": "是否主键"},
{"key": "COLUMN_COMMENT", "value": "备注"},
],
"TABLE_INFO": {"TABLE_SCHEMA": "test_db", "TABLE_NAME": "test_table"},
"COLUMNS": [
{
"COLUMN_NAME": "id",
"COLUMN_TYPE": "int",
"COLUMN_DEFAULT": None,
"IS_NULLABLE": "NO",
"EXTRA": "auto_increment",
"COLUMN_KEY": "PRI",
"COLUMN_COMMENT": "",
},
{
"COLUMN_NAME": "name",
"COLUMN_TYPE": "varchar(255)",
"COLUMN_DEFAULT": None,
"IS_NULLABLE": "YES",
"EXTRA": "",
"COLUMN_KEY": "",
"COLUMN_COMMENT": "",
},
],
}
]

self.assertEqual(result, expected_result)

@patch.object(MysqlEngine, "query")
def testAllDb(self, mock_query):
db_result = ResultSet()
Expand Down
Loading