Python利用sqlacodegen自动生成ORM实体类示例

当我们使用 Python 进行数据库操作时,可以使用 ORM(对象关系映射)来帮助我们简化 SQL 操作,将数据库表的记录映射成 Python 对象进行操作,ORM 工具中最流行的就是 SQLAlchemy 库。

但是,在使用 SQLAlchemy 库时,我们需要手动编写 ORM 实体类,这样会占用很多时间和精力。因此,我们可以使用 sqlacodegen 工具自动生成 ORM 实体类。以下是详细步骤:

前提条件

首先,我们需要安装以下软件:

  • Python 3 环境
  • SQL 数据库(如 MySQL 或 PostgreSQL)
  • SQLAlchemy 库
  • sqlacodegen 库

可以使用以下命令安装 SQLAlchemy 和 sqlacodegen 库:

pip install SQLAlchemy
pip install sqlacodegen

生成 ORM 实体类

假设我们有一个名叫 test 的数据库,其中包含一个名为 users 的表。我们可以使用以下命令生成对应的 ORM 实体类:

sqlacodegen --outfile=models.py mysql://username:password@localhost/test

其中,--outfile 参数指定生成的 ORM 实体类所在的文件名,mysql://username:password@localhost/test 是数据库连接字符串,这里需要根据实际情况进行修改。

生成的 models.py 文件内容如下:

# coding: utf-8
from sqlalchemy import BIGINT, Column, DateTime, Integer, String, text
from sqlalchemy.ext.declarative import declarative_base


Base = declarative_base()
metadata = Base.metadata


class User(Base):
    __tablename__ = 'users'

    id = Column(BIGINT(20), primary_key=True)
    name = Column(String(255))
    age = Column(Integer)
    created_time = Column(DateTime, server_default=text("CURRENT_TIMESTAMP"))

我们可以使用生成的 User 类来操作 users 表中的数据。例如,查询 users 表中的所有数据:

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from models import User


engine = create_engine('mysql://username:password@localhost/test')
Session = sessionmaker(bind=engine)
session = Session()

users = session.query(User).all()
for user in users:
    print(user.name)

注意事项

在生成 ORM 实体类时,有一些注意事项需要注意:

  • 如果数据库中表的字段名出现 Python 的关键字,sqlacodegen 会在生成 ORM 实体类时给该字段添加下划线前缀,例如 return 字段会被转化为 _return
  • sqlacodegen 会根据数据库中表的字段类型自动推断 ORM 实体类中字段的类型,但是有些类型可能会被推断错误,需要我们手动修改生成的代码。
  • 如果数据库中某个表的主键不是自动增长(auto_increment),则需要在生成的 ORM 实体类中手动设置主键的值。

示例说明

以下是两个示例说明,展示如何使用 sqlacodegen 自动生成 ORM 实体类。

示例 1

假设我们有一个名为 test 的 MySQL 数据库,其中有一个名为 books 的表,其中每个书籍包含 idnameauthor 三个字段。现在我们需要使用 sqlacodegen 自动生成对应的 ORM 实体类代码:

sqlacodegen --outfile=models.py mysql://username:password@localhost/test

这里的 --outfile 参数指定了生成的 ORM 实体类代码存放的文件名,可以根据实际情况进行修改。生成的 models.py 文件内容如下:

# coding: utf-8
from sqlalchemy import Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base


Base = declarative_base()
metadata = Base.metadata


class Book(Base):
    __tablename__ = 'books'

    id = Column(Integer, primary_key=True)
    name = Column(String(255), nullable=False)
    author = Column(String(255), nullable=False)

生成的 models.py 文件中包含了一个名为 Book 的 ORM 实体类,我们可以使用该类来操作 books 表中的数据。

示例 2

假设我们有一个名为 test 的 PostgreSQL 数据库,其中有一个名为 products 的表,其中每个商品包含 idnamepricestock 四个字段。其中,id 字段为主键,但不是自动增长的。现在我们需要使用 sqlacodegen 自动生成对应的 ORM 实体类代码:

sqlacodegen --outfile=models.py postgresql://username:password@localhost/test

这里的 --outfile 参数指定了生成的 ORM 实体类代码存放的文件名,可以根据实际情况进行修改。生成的 models.py 文件内容如下:

# coding: utf-8
from sqlalchemy import Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base


Base = declarative_base()
metadata = Base.metadata


class Product(Base):
    __tablename__ = 'products'

    id = Column(Integer, primary_key=True)
    name = Column(String(255), nullable=False)
    price = Column(Integer, nullable=False)
    stock = Column(Integer, nullable=False)

生成的 models.py 文件中包含了一个名为 Product 的 ORM 实体类,我们可以使用该类来操作 products 表中的数据。注意,在该表中,主键不是自动增长的,因此我们需要手动为 id 字段设置值。以下是一个示例代码:

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from models import Product


engine = create_engine('postgresql://username:password@localhost/test')
Session = sessionmaker(bind=engine)
session = Session()

product = Product()
product.id = 1
product.name = 'Apple'
product.price = 10
product.stock = 100

session.add(product)
session.commit()

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python利用sqlacodegen自动生成ORM实体类示例 - Python技术站

(0)
上一篇 2023年6月3日
下一篇 2023年6月3日

相关文章

  • Python 爬虫的工具列表大全

    下面我将为您详细讲解“Python 爬虫的工具列表大全”的完整攻略。 标题 首先,我们来到这篇文章的标题部分。在Markdown中,标题的表示方法是使用“#”符号。文章的标题应该使用一级标题,即在标题文本下面加上一个“#”。如下: # Python 爬虫的工具列表大全 该标题使用了一级标题的表示方法,即一个“#”符号后面直接加上标题文本,不需要其他符号或空格…

    python 2023年5月14日
    00
  • python中time库的实例使用方法

    标准的markdown格式文本中,我们可以使用标题、段落、代码块等语法来表达我们想要表达的内容。下面就是关于“python中time库的实例使用方法”的完整攻略。 简介 Python中的time模块提供了各种与时间有关的函数。这些函数被广泛用于计算机科学和科学工程中的时间计算和处理。time模块中的主要函数包括处理日期/时间的标准函数,如time(),loc…

    python 2023年6月2日
    00
  • 如何使用Python使用ORM操作MySQL数据库?

    以下是如何使用Python使用ORM操作MySQL数据库的完整使用攻略,包括安装ORM框架、连接数据库、创建模型类、执行CRUD操作等步骤。同时,提供两个示例以便更好理解如何使用Python使用ORM操作MySQL数据库。 步骤1:安装ORM框架 在Python中,我们可以使用ORM框架来操作MySQL数据库。常用的ORM框架有SQLAlchemy、Djan…

    python 2023年5月12日
    00
  • 解决Jupyter 文件路径的问题

    解决Jupyter文件路径问题,我们需要了解当前操作系统的文件路径表示方式,以及Jupyter的内部路径表示方式,并根据这些信息来设置正确的文件路径。 一、操作系统的文件路径表示方式 不同的操作系统有不同的文件路径表示方式,例如Windows系统和UNIX/LINUX系统的表示方式就不同。 Windows系统 Windows系统的文件路径格式为:盘符:\路径…

    python 2023年6月5日
    00
  • python可视化text()函数使用详解

    Python可视化text()函数使用详解 简介 text()函数是python可视化工具中常用的函数之一,可以在matplotlib、seaborn等常用工具中使用。它的作用是在图表中添加文字。可以用于标注数据点、图例、坐标轴等等。 函数语法 matplotlib.pyplot.text(x, y, s, fontdict=None, withdash=F…

    python 2023年6月5日
    00
  • python基础–除法(/,//,%)的应用说明

    下面是Python基础中除法(/,//,%)的应用说明的完整攻略: 一、除法(/) 除法(/)是Python中的一种基本运算,在数学中,除法是指将被除数除以除数,得到商和余数的运算。在Python中,除法的结果是一个浮点数,无论是两个整数相除,还是两个浮点数相除,都会返回一个浮点数结果。 示例说明: a = 10 b = 3 print(a / b) 输出结…

    python 2023年5月30日
    00
  • Python办公自动化解决world文件批量转换

    由于本题目的内容较为复杂,我们需要进行较为详细的讲解。为了方便阅读,将整理出目录: 前置条件 安装Python-docx模块 解析word文件 转换word文件 实战一:word批量转txt 实战二:word批量转pdf 总结 1. 前置条件 在进行Python办公自动化的编写之前,需要具备以下条件: Python3.x环境 用于编写代码的编辑器或IDE 安…

    python 2023年6月3日
    00
  • 【0基础学爬虫】爬虫基础之自动化工具 Selenium 的使用

    大数据时代,各行各业对数据采集的需求日益增多,网络爬虫的运用也更为广泛,越来越多的人开始学习网络爬虫这项技术,K哥爬虫此前已经推出不少爬虫进阶、逆向相关文章,为实现从易到难全方位覆盖,特设【0基础学爬虫】专栏,帮助小白快速入门爬虫,本期为自动化工具 Selenium 的使用。 概述 目前,很多网站都采用 Ajax 等技术进行动态加载数据,想要采集这类网站的数…

    python 2023年4月22日
    00
合作推广
合作推广
分享本页
返回顶部