首页 > 数据库 >mysql table to proto message

mysql table to proto message

时间:2023-12-19 14:37:11浏览次数:38  
标签:return Protobuf proto db mysql table message type name

用 Python 从 MySQL 信息模式生成 Protobuf 结构

在许多软件项目中,特别是使用 MySQL 数据库的项目中,通常使用 Protocol Buffers(Protobuf)进行高效的数据序列化。如果你发现自己需要将 MySQL 数据库架构信息转换为 Protobuf 消息,这个 Python 脚本可能是一个有价值的工具。

概览

这个 Python 脚本利用 SQLAlchemy 和 MySQL 数据库的信息模式,动态生成 Protobuf 消息结构。它从 MySQL 的 information_schema 中检索关于表和列的信息,然后创建相应的 Protobuf 消息定义。

功能

  • 动态生成: 脚本根据指定 MySQL 数据库中的表和列动态生成 Protobuf 消息。

  • 灵活的类型映射: 它智能地将 MySQL 数据类型映射到它们对应的 Protobuf 类型,为生成的 Protobuf 消息提供了灵活性和准确性。

  • 结构化输出: 生成的 Protobuf 消息以结构化的方式组织,方便集成到你的 Protobuf 模式中。

如何使用

  1. 配置: 在脚本中设置 db_namedb_url 的适当值,以匹配你的 MySQL 数据库。

  2. 运行脚本: 执行脚本,它将自动连接到数据库,检索模式信息,并生成 Protobuf 消息。

  3. 输出文件: 生成的 Protobuf 消息保存在 out_py.proto 文件中,可以直接包含在你的 Protobuf 模式中。

依赖项

  • SQLAlchemy:Python 中强大的 SQL 工具包和对象关系映射(ORM)库。

  • MySQL Connector:Python 中用于 MySQL 的驱动程序。

结论

这个脚本简化了将 MySQL 数据库架构信息集成到 Protobuf 模式的过程,节省了时间,确保数据库和 Protobuf 数据模型之间的一致性。

随时根据项目需求定制脚本,并让它成为你软件开发旅程中有用的工具。

import re

from sqlalchemy import create_engine, Column as SQLColumn, String
from sqlalchemy.orm import sessionmaker
from sqlalchemy.orm.decl_api import declarative_base

Base = declarative_base()


class Table(Base):
    __tablename__ = 'TABLES'
    TABLE_NAME = SQLColumn('TABLE_NAME', String, primary_key=True)
    TABLE_SCHEMA = SQLColumn('TABLE_SCHEMA', String)


class MyColumn(Base):
    __tablename__ = 'COLUMNS'
    COLUMN_NAME = SQLColumn('COLUMN_NAME', String, primary_key=True)
    DATA_TYPE = SQLColumn('DATA_TYPE', String)
    COLUMN_COMMENT = SQLColumn('COLUMN_COMMENT', String)
    TABLE_NAME = SQLColumn('TABLE_NAME', String)
    TABLE_SCHEMA = SQLColumn('TABLE_SCHEMA', String)


def generate_message_structure(db_session, db_name, table):
    columns = db_session.query(MyColumn).filter(MyColumn.TABLE_SCHEMA == db_name, MyColumn.TABLE_NAME == table).all()

    txt = ""
    for index, col in enumerate(columns):
        if col.COLUMN_COMMENT:
            txt += f"    {pb_type(col.DATA_TYPE)} {camel_case(col.COLUMN_NAME)} = {index + 1}; //{col.COLUMN_COMMENT}\n"
        else:
            txt += f"    {pb_type(col.DATA_TYPE)} {camel_case(col.COLUMN_NAME)} = {index + 1};\n"
    txt = f"message {tb_name(table)} {{\n{txt}}}\n"
    return txt


def tb_name(table_name):
    words = re.split(r'_', table_name)
    return ''.join(word.capitalize() for word in words)


def camel_case(s):
    parts = re.split(r'_', s)
    return parts[0].lower() + ''.join(word.capitalize() for word in parts[1:])


def pb_type(mysql_type):
    if mysql_type in ["varchar", "char", "text", "mediumtext", "longtext"]:
        return "string"
    elif mysql_type in ["timestamp", "datetime", "date", "time"]:
        return "google.protobuf.Timestamp"
    elif mysql_type == "bigint":
        return "int64"
    elif mysql_type in ["int", "mediumint", "smallint", "tinyint"]:
        return "int32"
    elif mysql_type in ["double", "decimal"]:
        return "double"
    elif mysql_type == "float":
        return "float"
    elif mysql_type == "json":
        return "google.protobuf.Any"
    elif mysql_type in ["enum", "set"]:
        return "string"
    elif mysql_type in ["binary", "varbinary", "blob", "longblob", "mediumblob", "tinyblob"]:
        return "bytes"
    else:
        return "string"


def generate_proto_file(db_session, db_name):
    tables = db_session.query(Table).filter(Table.TABLE_SCHEMA == db_name).all()

    message = """syntax = "proto3";
package pbdef;
import "google/protobuf/any.proto";
import "google/protobuf/timestamp.proto";

    """
    for table in tables:
        message += generate_message_structure(db_session, db_name, table.TABLE_NAME) + "\n"

    with open("out_py.proto", "w", encoding='utf-8') as file:
        file.write(message)


if __name__ == "__main__":
    db_name = "dopai"
    db_url = "mysql+mysqlconnector://lzj:[email protected]:3306/information_schema"

    engine = create_engine(db_url)
    # Base.metadata.create_all(engine)

    Session = sessionmaker(bind=engine)
    db_session = Session()
    generate_proto_file(db_session, db_name)

    print("Protobuf structure has been saved to out.proto.")

标签:return,Protobuf,proto,db,mysql,table,message,type,name
From: https://www.cnblogs.com/--just-lbk/p/17913658.html

相关文章

  • protobuf原理(转)
    原文:https://zhuanlan.zhihu.com/p/633656133protobuf的优点有:高效的编码和解码性能:protobuf使用二进制编码,相比于传统的文本格式如XML和JSON,可以更高效地进行数据的编码和解码,减少网络传输和存储的开销。跨平台和语言支持:protobuf可以在多种编程语言和平台上使用,例如C++,Jav......
  • C++ Qt开发:TableWidget表格组件
    Qt是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍TableWidget表格组件的常用方法及灵活运用。QTableWidget是Qt中用于显示表格数据的部件。它是......
  • 苹果推信imessage群发短信:海外拓客大揭秘
    想要拓展海外客户,却苦于没有合适的渠道?别担心,今天就给大家分享一个实用的方法——使用苹果imessage群发短信进行海外拓客。首先,你需要准备好你的苹果设备,并确保你的imessage已经启用。然后,你可以通过添加联系人或者使用现有的客户名单来创建你的短信群发对象。接下来,你可以编写一......
  • .Net 8与硬件设备能碰撞出怎么样的火花(使用ImageSharp和Protobuf协议通过HidApi与设备
    前言本人最近在社区里说想做稚晖君的那个瀚文键盘来着,结果遇到两个老哥一个老哥送了我电路板,一个送了我焊接好元件的电路板,既然大家这么舍得,那我也就真的投入制作了这把客制化键盘,当然我为了省钱也是特意把外壳模型重新切割,用3D打印机打印了整个外壳,不得不说省了八九百的CNC费用......
  • 当指定了一个 messageid 后,发送或插入消息,即使成功,也查询不到此消息
    SDKmessageid仅在发送失败时,可以使用SDK已经构建好的id,不支持自己指定一个自定义的id值。如果传入一个SDK不存在的id会导致消息丢失如果传入一个SDK存在的但不是当前消息的id,会导致原有消息内容发生变更,导致消息错乱。......
  • Stable LM Zephyr 3B:手机上的强大LLM助手
    概览最近,Stability.ai宣布开源了StableLMZephyr3B,这是一个30亿参数的大语言模型(LLM),专为手机、笔记本等移动设备设计。其突出的特点是参数较小、性能强大且算力消耗低,能够自动生成文本、总结摘要等,与70亿、130亿参数的模型相媲美。Huggingface模型下载:https://huggingface.co/s......
  • Applescript成功实现imessage数据筛选,imessage蓝号检测,无痕检测手机号是否注册imess
    一、imessages数据检测的两种方式:1.人工筛选,将要验证的号码输出到文件中,以逗号分隔。再将文件中的号码粘贴到iMessage客户端的地址栏,iMessage客户端会自动逐个检验该号码是否为iMessage账号,检验速度视网速而定。红色表示不是iMessage账号,蓝色表示iMessage账号。2.编写苹果MacOs......
  • pt-table-checksum 使用介绍
    说明pt-table-checksum验证mysql复制的完整性。语法:pt-table-checksum[OPTIONS][DSN]pt-table-checksum通过在主节点上执行校验和查询来执行在线复制一致性检查,从而在与主节点不一致的从库上产生不同的结果。可选的DSN指定了主节点。如果发现任何差异,或出现任何警告或......
  • Sortable 拖拽排序组件实现原理
    如果想要实现拖拽排序功能,有很多现成的库可以供使用,比如Sortable.js(vuedraggable)、dnd-kit(react-dnd)等可以轻松帮助实现这一功能。本文的目标不是介绍如何使用这些库,而是手动实现一个简单版的Sortable组件。通过本文的阅读,您将深入了解拖拽排序的核心原理。使用模板使用Sor......
  • react使用antd Table单元格中文字超出时省略
    实现效果使用antd中的Table,设置固定列宽,当文字超出时省略,先看实现效果:部分代码使用ellipsis进行省略,使用Tooltip(引入自antd)展示全部的内容。constTABLE_COL_WIDTH=200;constcolumns=[{title:'项目名称',dataIndex:'name',key:'......