python --導出數據庫表結構(pymysql)

import pymysql
from pymysql.cursors import DictCursor
from typing import Optional, Dict, List, Anyclass DBSchemaExporter:"""MySQL數據庫表結構導出工具,支持提取表和字段注釋使用示例:>>> exporter = DBSchemaExporter("localhost", "user", "password", "dbname")>>> schema = exporter.export(include_comments=True)>>> print(schema)>>> exporter.save_to_file("schema.txt")"""def __init__(self, host: str, user: str, password: str, database: str, port: int = 3306, charset: str = 'utf8mb4'):"""初始化數據庫連接配置"""self.config = {'host': host,'user': user,'password': password,'database': database,'port': port,'charset': charset,'cursorclass': DictCursor}self.schema = Nonedef export(self, include_comments: bool = True, include_tables: Optional[List[str]] = None, exclude_tables: Optional[List[str]] = None) -> Optional[str]:"""導出數據庫表結構,支持包含注釋Args:include_comments: 是否包含表和字段注釋include_tables: 只包含指定的表exclude_tables: 排除指定的表Returns:包含所有表結構的字符串,失敗時返回None"""try:# 獲取表和字段注釋信息table_comments = {}column_comments = {}if include_comments:table_comments, column_comments = self._fetch_comments()with pymysql.connect(**self.config) as connection:with connection.cursor() as cursor:# 獲取所有表名cursor.execute("SHOW TABLES")all_tables = [row[f"Tables_in_{self.config['database']}"] for row in cursor.fetchall()]# 過濾表if include_tables:tables = [t for t in all_tables if t in include_tables]else:tables = all_tablesif exclude_tables:tables = [t for t in tables if t not in exclude_tables]# 獲取每個表的結構table_schemas = []for table in tables:# 獲取表的創建語句cursor.execute(f"SHOW CREATE TABLE `{table}`")create_table = cursor.fetchone()["Create Table"]# 提取表結構部分table_structure = create_table.split(f"CREATE TABLE `{table}`", 1)[1].strip()# 添加表注釋(如果有)if include_comments and table in table_comments:comment_line = f"-- 表注釋: {table_comments[table]}"table_schemas.append(f"{comment_line}\n{table} (\n{table_structure}\n)\n")else:table_schemas.append(f"{table} (\n{table_structure}\n)\n")self.schema = "\n\n".join(table_schemas)return self.schemaexcept Exception as e:print(f"導出失敗: {e}")return Nonedef _fetch_comments(self) -> tuple:"""獲取所有表和字段的注釋信息"""table_comments = {}column_comments = {}with pymysql.connect(**self.config) as connection:with connection.cursor() as cursor:# 獲取表注釋cursor.execute("""SELECT TABLE_NAME, TABLE_COMMENT FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = %s""", (self.config['database'],))for row in cursor.fetchall():table_comments[row['TABLE_NAME']] = row['TABLE_COMMENT']# 獲取字段注釋cursor.execute("""SELECT TABLE_NAME, COLUMN_NAME, COLUMN_COMMENT FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = %s""", (self.config['database'],))for row in cursor.fetchall():table = row['TABLE_NAME']column = row['COLUMN_NAME']comment = row['COLUMN_COMMENT']if table not in column_comments:column_comments[table] = {}column_comments[table][column] = commentreturn table_comments, column_commentsdef save_to_file(self, file_path: str, overwrite: bool = False) -> bool:"""將導出的表結構保存到文件Args:file_path: 文件路徑overwrite: 是否覆蓋已存在的文件Returns:保存成功返回True,失敗返回False"""if self.schema is None:print("沒有導出的表結構,請先調用export()方法")return Falsetry:# 檢查文件是否存在import osif os.path.exists(file_path) and not overwrite:print(f"文件已存在: {file_path},設置overwrite=True以覆蓋")return Falsewith open(file_path, 'w', encoding='utf-8') as f:f.write(self.schema)return Trueexcept Exception as e:print(f"保存失敗: {e}")return Falsedef get_table_details(self) -> Optional[Dict[str, List[Dict[str, Any]]]]:"""獲取每個表的詳細列信息,包括注釋Returns:包含表和列信息的字典,格式為:{'table1': [{'Field': 'id', 'Type': 'int', 'Comment': '主鍵'}, ...],'table2': [...]}"""try:table_details = {}with pymysql.connect(**self.config) as connection:with connection.cursor() as cursor:# 獲取所有表名cursor.execute("SHOW TABLES")tables = [row[f"Tables_in_{self.config['database']}"] for row in cursor.fetchall()]for table in tables:cursor.execute(f"SHOW FULL COLUMNS FROM `{table}`")columns = cursor.fetchall()table_details[table] = columnsreturn table_detailsexcept Exception as e:print(f"獲取表詳細信息失敗: {e}")return None# 使用示例
if __name__ == "__main__":# 配置數據庫連接exporter = DBSchemaExporter(host="localhost",user="your_username",password="your_password",database="your_database")# 示例1: 導出包含注釋的完整表結構schema_with_comments = exporter.export(include_comments=True)if schema_with_comments:print("帶注釋的完整表結構:")print(schema_with_comments)exporter.save_to_file("full_schema_with_comments.txt", overwrite=True)# 示例2: 導出特定表的結構(不帶注釋)specific_schema = exporter.export(include_comments=False,include_tables=["users", "orders"])if specific_schema:print("\n特定表的結構(不帶注釋):")print(specific_schema)exporter.save_to_file("specific_schema.txt", overwrite=True)# 示例3: 獲取詳細的列信息(包括注釋)table_details = exporter.get_table_details()if table_details:print("\n表列詳細信息:")for table, columns in table_details.items():print(f"\n{table}:")for column in columns[:3]:  # 只顯示每個表的前3列comment = column.get('Comment', '')print(f"  - {column['Field']} ({column['Type']}){' - ' + comment if comment else ''}")

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/83162.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/83162.shtml
英文地址,請注明出處:http://en.pswp.cn/web/83162.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Kafka 消息模式實戰:從簡單隊列到流處理(二)

四、Kafka 流處理實戰 4.1 Kafka Streams 簡介 Kafka Streams 是 Kafka 提供的流處理庫,它為開發者提供了一套簡潔而強大的 API,用于構建實時流處理應用程序。Kafka Streams 基于 Kafka 的高吞吐量、分布式和容錯特性,能夠處理大規模的實時…

VAS1086Q 奇力科技線性芯片車規用品LED驅動芯片

一、產品概述 名稱與定位:VAS1086Q 是奇力科技(Chiplead Technology)推出的汽車級恒流 LED 驅動器,屬于 Value Added Solutions 系列,專為汽車 LED 照明應用提供高性價比方案。 核心功能: 支持 10~400mA 可…

適應性Java用于現代 API:REST、GraphQL 和事件驅動

在快速發展的軟件開發領域,REST、GraphQL 和事件驅動架構等新的 API 標準對于構建可擴展、高效的系統至關重要。Java 在現代 API 方面以其在企業應用中的穩定性而聞名,不斷適應這些現代范式的需求。隨著不斷發展的生態系統,Java 在現代 API 方…

浮點數精度問題(CSP38思考)

CSP38的第一題,考到了浮點數的除法(當然考完發現其實也可以不涉及浮點數,直接轉化為整型),我第一題一直卡到70、80分,故寫下此文。 浮點數的運算有精度損失問題,那么應該如何解決和避免呢&#…

F5 – TCP 連接管理:會話、池級和節點級操作

在 F5 BIG-IP 中,您可以在池成員級別或節點級別管理流向服務器的流量。節點級別狀態會影響與該節點關聯的所有池,而池成員狀態則僅限于單個池。了解每種方法以及何時使用它們對于順利進行維護窗口和流量管理至關重要。 池級狀態:啟用、禁用、強制離線、移除 在 BIG-IP 配置…

StoreView SQL,讓數據分析不受地域限制

作者:章建(處知) 引言 日志服務 SLS 是云原生觀測和分析平臺,為 Log、Metric、Trace 等數據提供大規模、低成本、實時的平臺化服務。SLS 提供了多地域支持【1】,方便用戶可以根據數據源就近接入 SLS 服務&#xff0c…

爬蟲基礎學習day2

# 爬蟲設計領域 工商:企查查、天眼查短視頻:抖音、快手、西瓜 ---> 飛瓜電商:京東、淘寶、聚美優品、亞馬遜 ---> 分析店鋪經營決策標題、排名航空:抓取所有航空公司價格 ---> 去哪兒自媒體:采集自媒體數據進…

Golang——10、日志處理和正則處理

日志處理和正則處理 1、logx日志處理1.1、logx簡介1.2、日志初始化與配置1.3、常用方法1.4、配合defer捕獲panic 2、正則處理2.1、正則表達式語法大全2.2、基本匹配2.3、常見函數使用2.4、從html提取漢字demo 1、logx日志處理 1.1、logx簡介 logx 是 go-zero 框架中用于日志記…

【LeetCode】3309. 連接二進制表示可形成的最大數值(遞歸|回溯|位運算)

LeetCode 3309. 連接二進制表示可形成的最大數值(中等) 題目描述解題思路Java代碼 題目描述 題目鏈接:LeetCode 3309. 連接二進制表示可形成的最大數值(中等) 給你一個長度為 3 的整數數組 nums。 現以某種順序 連接…

C++八股 —— 單例模式

文章目錄 1. 基本概念2. 設計要點3. 實現方式4. 詳解懶漢模式 1. 基本概念 線程安全(Thread Safety) 線程安全是指在多線程環境下,某個函數、類或代碼片段能夠被多個線程同時調用時,仍能保證數據的一致性和邏輯的正確性&#xf…

軟件工程:如何做好軟件產品

1、什么是產品 從項目到產品 產品:滿足行業共性需求的標準產品。即要能夠做到配置化的開發,用同一款產品最大限度地滿足不同客戶的需求,同時讓產品具有可以快速響應客戶需求變化的能力。 好的產品一定吸收了多個項目的共性,一定是…

Cinnamon修改面板小工具圖標

Cinnamon開始菜單-CSDN博客 設置模塊都是做好的,比GNOME簡單得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…

sqlsugar WhereIF條件的大于等于和等于查出來的坑

一、如下圖所示,當我用 .WhereIF(input.Plancontroltype > 0, u > u.Plancontroltype (DnjqPlancontroltype)input.Plancontroltype) 這里面用等于的時候,返回結果一條數據都沒有。 上圖中生成的SQL如下: SELECT id AS Id ,code AS …

centos 7 部署awstats 網站訪問檢測

一、基礎環境準備(兩種安裝方式都要做) bash # 安裝必要依賴 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 設置 Apache 開機自啟 systemctl start httpd # 啟動 Apache二、安裝 AWStats&#xff0…

React從基礎入門到高級實戰:React 實戰項目 - 項目四:企業級儀表盤

React 實戰項目:企業級儀表盤 歡迎來到 React 開發教程專欄 的第 29 篇!在前 28 篇文章中,我們從 React 的基礎概念逐步深入到高級技巧,涵蓋了組件設計、狀態管理、路由配置、性能優化和實時通信等核心內容。這一次,我…

STM32----IAP遠程升級

一、概述: IAP,全稱是“In-Application Programming”,中文解釋為“在程序中編程”。IAP是一種對通過微控制器的對外接口(如USART,IIC,CAN,USB,以太網接口甚至是無線射頻通道&#…

模擬搭建私網訪問外網、外網訪問服務器服務的實踐操作

目錄 實驗環境 實踐要求 一、準備工作 1、準備四臺虛擬機,分別標號 2、 防火墻額外添加兩塊網卡,自定義網絡連接模式 3、 關閉虛擬機的圖形管理工具 4、關閉防火墻 5、分別配置四臺虛擬機的IP地址,此處舉一個例子(使用的臨…

刪除遠程已經不存在但本地仍然存在的Git分支

1. 獲取遠程分支列表 首先,確保你獲取了遠程倉庫的最新分支信息: git fetch -p -p 參數會自動清理本地倉庫中那些在遠程已經被刪除的分支的引用。 2. 查看本地分支與遠程分支的對比 運行以下命令來查看哪些本地分支沒有對應的遠程分支: …

GIT(AI回答)

在Git中,git push 命令主要用于將本地分支的提交推送到?遠程倉庫?(如GitHub、GitLab等)。如果你希望將本地分支的改動同步到另一個?本地分支?,這不是 git push 的設計目的。以下是正確的替代方法: 方法1&#xff1…

深入剖析AI大模型:大模型時代的 Prompt 工程全解析

今天聊的內容,我認為是AI開發里面非常重要的內容。它在AI開發里無處不在,當你對 AI 助手說 "用李白的風格寫一首關于人工智能的詩",或者讓翻譯模型 "將這段合同翻譯成商務日語" 時,輸入的這句話就是 Prompt。…