• SQLAlchemy学习-3.(懒人专用)sqlacodegen自动同步数据库中表生成model 代码


    前言

    如果数据库中的表已经存在了,我们只想通过 SQLAlchemy 操作数据库表的数据,不需要建表。
    这时可以不用一个个声明每个字段类型,可以用第三方包 sqlacodegen 自动生成 model 模型代码。

    sqlacodegen 安装

    使用pip安装对应包

    pip install sqlacodegen==2.3.0
    
    • 1

    mysql 指定导出表命令

    # 指定表 导出 model
    sqlacodegen mysql+pymysql://user:password@127.0.0.1:3306/dbname --outfile=models.py
    
    • 1
    • 2

    连接sql server数据库

    sqlacodegen mssql+pymssql://user:password@host:port/dbname --outfile=models.py
    
    • 1

    连接sqlite

    # 将数据库中所有表导出为 model
    sqlacodegen sqlite:///testdb.db --outfile=models.py
    
    • 1
    • 2

    sqlacodegen 命令行参数-h查看

    >sqlacodegen -h
    usage: sqlacodegen [-h] [--version] [--schema SCHEMA] [--tables TABLES] [--noviews] [--noindexes]
                       [--noconstraints] [--nojoined] [--noinflect] [--noclasses] [--nocomments]
                       [--outfile OUTFILE]
                       [url]
    
    Generates SQLAlchemy model code from an existing database.
    
    positional arguments:
      url                SQLAlchemy url to the database
    
    optional arguments:
      -h, --help         show this help message and exit
      --version          print the version number and exit
      --schema SCHEMA    load tables from an alternate schema
      --tables TABLES    tables to process (comma-separated, default: all)
      --noviews          ignore views
      --noindexes        ignore indexes
      --noconstraints    ignore constraints
      --nojoined         don't autodetect joined table inheritance
      --noinflect        don't try to convert tables names to singular form
      --noclasses        don't generate classes, only tables
      --nocomments       don't render column comments
      --outfile OUTFILE  file to write output to (default: stdout)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    使用实例

    比如我在mysql数据库中有一张表,结构如下

    数据库连接地址

    # 拼接配置dialect + driver://username:passwor@host:port/database
    DB_URI = 'mysql+pymysql://root:123456@localhost:3306/web'
    
    • 1
    • 2

    只想同步students 这张表的数据,执行命令

    sqlacodegen mysql+pymysql://root:123456@localhost:3306/web --outfile=models.py --tables students
    
    • 1

    相关参数说明:
    –outfile 指定导出模块名称models.py
    –tables 指定导出的表名称,多个表用逗号隔开,不指定导出全部表

    执行后得到models.py,内容如下

    # coding: utf-8
    from sqlalchemy import Column, String
    from sqlalchemy.dialects.mysql import INTEGER
    from sqlalchemy.ext.declarative import declarative_base
    
    Base = declarative_base()
    metadata = Base.metadata
    
    
    class Student(Base):
        __tablename__ = 'students'
    
        id = Column(INTEGER(11), primary_key=True)
        name = Column(String(20))
        fullname = Column(String(30))
        nickname = Column(String(30))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    如果命令不带--tables 参数,会生成所有的表

    sqlacodegen mysql+pymysql://root:123456@localhost:3306/web --outfile=models.py
    
    • 1

    使用 autoload = True

    还有一种方法可以让模型代码跟数据库表字段关联起来,__table__ 中使用 autoload = True
    它会自动加载 model 的 Column, 使用这种方法时,在构建 model 之前,Base 类要与 engine 进行绑定.

    from sqlalchemy import create_engine
    from sqlalchemy.ext.declarative import declarative_base
    from sqlalchemy.sql.schema import Table
    
    engine = create_engine("mysql+pymysql://root:123456@localhost:3306/web")
    Base = declarative_base()
    metadata = Base.metadata
    metadata.bind = engine
    
    
    class Employee(Base):
        __table__ = Table("employees", metadata, autoload=True)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    这种方法我们看不到代码里面表字段名称,一般不推荐用。

  • 相关阅读:
    CentOS下对安装不同ModSecurity版本的Nginx的并发性能测试
    nmap之nse脚本简单学习
    【Acwing187】导弹防御系统(LIS+剪枝+贪心+dfs+迭代加深)
    排序1:直接插入排序
    MySQL InnoDB缓存
    用工具实现 Mock API 的整个流程
    伙伴匹配(后端)-- 用户注册功能
    前端设计模式之【单例模式】
    CF1000F One Occurrence
    【VUEX】最好用的传参方式--Vuex的详解
  • 原文地址:https://blog.csdn.net/qq_27371025/article/details/126440632