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中执行量化回归,有几个步骤需要遵循。以下是一些标准步骤: 步骤1:导入必要的库 在执行量化回归前,需要导入一些必要的库,比如pandas、numpy、statsmodels等。 import pandas as pd import numpy as np import statsmodels.api as sm 步骤2:收集数据 在此示例中…

    python-answer 2023年3月25日
    00
  • Python2和Python3中urllib库中urlencode的使用注意事项

    Python 2 和 Python 3 版本中 urllib 库的 urlencode 函数用于将字典或参数列表转换为 URL 编码的数据。但是在 Python 2 和 Python 3 中使用的方法略有不同。 Python 2 基本使用 在 Python 2 中使用 urlencode 函数需要先导入 urllib 模块。urlencode 函数接受一个字…

    python 2023年5月31日
    00
  • odoo 开发入门教程系列-添加修饰

    添加修饰 我们的房地产模块现在从商业角度来看是有意义的。我们创建了特定的视图,添加了几个操作按钮和约束。然而,我们的用户界面仍然有点粗糙。我们希望为列表视图添加一些颜色,并使一些字段和按钮有条件地消失。例如,当房产已出售或取消时,“已售出”和“取消”按钮应消失,因为此时不再允许更改状态。 参考: 文档关联的主题可以查看 Views. 内联视图(Inline …

    python 2023年4月18日
    00
  • Python词法结构

    下面是Python词法结构的详细讲解。 什么是Python词法结构 Python词法结构是指Python语言中用于表示语义的基本单元,是编译器在对Python源代码进行词法分析时所依据的基本单位。Python词法结构包括注释、标识符、关键字、字面常量、分隔符和运算符等。 注释 注释在Python中以#为起始符号,从#开始到行末均为注释内容,编译器会自动忽略这…

    python 2023年5月20日
    00
  • 浅谈Python中re.match()和re.search()的使用及区别

    下面是详细讲解“浅谈Python中re.match()和re.search()的使用及区别”的完整攻略。 1. 总体介绍 正则表达式是一个十分强大的工具,它能在处理文本数据时极大地提高效率。Python中提供了re模块来支持正则表达式操作,其中包括re.match()和re.search()两个方法。这两个方法非常相似,都用来在字符串中查找模式,但是区别在于…

    python 2023年5月13日
    00
  • Python collections.defaultdict模块用法详解

    Python collections.defaultdict模块用法详解 概述 Python中的collections模块提供了一种名为defaultdict的数据类型,它是一个子类(dict class)。 这意味着defaultdict类继承了dict类中所有的方法,而且还有自己的实现。在使用defaultdict时,如果字典中的键不存在,它可以自动创建…

    python 2023年6月3日
    00
  • Python jiaba库的使用详解

    Python jieba库的使用详解 简介 Jieba是一款开源的中文分词库,在中文自然语言处理领域具有非常广泛的应用。Jieba分词速度非常快,支持三种分词模式和特定领域分词。本文将给出Jieba库的基本使用方法,并介绍三种分词模式和特定领域分词,同时也给出几个实例进行演示。 安装 使用pip即可安装jieba: pip install jieba 基本使…

    python 2023年5月20日
    00
  • 用Python编写分析Python程序性能的工具的教程

    下面我将为你详细讲解如何用Python编写分析Python程序性能的工具。 一、为什么需要分析Python程序性能? Python是一门脚本语言,具有易学易用的特点,但也容易出现程序性能问题,导致程序运行缓慢,甚至崩溃。因此,分析Python程序性能十分重要,能够发现程序中的瓶颈并优化代码,提高程序的运行效率。 二、Python性能分析工具的选择 目前Pyt…

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