SQLAlchemy使用MetaData对象与模型类操作数据库表

`MetaData` 对象和模型类在使用 SQLAlchemy 与 数据库进行交互时,有一些不同之处。

使用 `MetaData` 对象,可直接操作数据库表结构。它允许您定义表名、列名、数据类型等。然后,使用 `create_all` 方法创建这些表。这种方法更适合在需要完全控制数据库表结构的情况下,例如在创建数据库时进行初始设置。

MetaData 对象是 SQLAlchemy 中的一个核心组件,它用于表示数据库表结构。使用 MetaData 对象,您可以直接操作数据库表结构,而不需要定义模型类。这种方法更适合在需要完全控制数据库表结构的情况下,例如在创建数据库时进行初始设置。

MetaData 对象的主要特点和应用场景:

  • 定义表名、列名、数据类型等。
  • 使用 Table 类创建表,并将其与 MetaData 对象关联。
  • 使用 create_all 方法创建表,将 MetaData 对象和引擎对象作为参数传递。
  • 在没有使用 ORM 的情况下,使用 MetaData 对象进行数据库操作。
    from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String, DateTime
    from sqlalchemy.sql import select
    import datetimemetadata = MetaData()table_users = Table('users', metadata,Column('id', Integer, primary_key=True),  # 添加主键属性Column('name', String),Column('age', Integer),Column('created_at', DateTime)
    )engine = create_engine('sqlite:///MetaDatausers.db')metadata.create_all(engine)# 插入数据
    insert_stmt = table_users.insert().values(name='Alice', age=30, created_at=datetime.datetime.now()
    )
    with engine.connect() as connection:connection.execute(insert_stmt)
    insert_stmt = table_users.insert().values(name='Bob', age=25, created_at=datetime.datetime.now()
    )with engine.connect() as connection:connection.execute(insert_stmt)connection.commit()insert_stmt = table_users.insert().values(name='Charlie', age=35, created_at=datetime.datetime.now()
    )with engine.connect() as connection:connection.execute(insert_stmt)connection.commit()insert_stmt = table_users.insert().values(name='David', age=40, created_at=datetime.datetime.now()
    )with engine.connect() as connection:connection.execute(insert_stmt)connection.commit()insert_stmt = table_users.insert().values(name='Eve', age=45, created_at=datetime.datetime.now()
    )with engine.connect() as connection:connection.execute(insert_stmt)connection.commit()# 查询数据
    select_stmt = table_users.select()with engine.connect() as connection:result = connection.execute(select_stmt)for row in result.fetchall():print(row)
    

使用模型类,可以定义类来表示数据库表的结构。

模型类是 SQLAlchemy 中的另一个核心组件,它用于表示数据库表的结构。模型类与数据库表一一对应,每个模型类对应一个表模型类更适合在需要对数据库表进行复杂查询和操作时,例如在使用 ORM 进行数据操作时。

模型类的主要特点和应用场景:

  • 定义类来表示数据库表的结构,每个模型类对应一个表。
  • 使用 declarative_base() 函数创建基类,然后继承该基类创建模型类。
  • 在模型类中使用 Column 装饰器定义列名、数据类型等。
  • 使用 ORM 进行数据操作,例如插入、查询、更新和删除数据。
from sqlalchemy import create_engine, Column, Integer, String, DateTime
from sqlalchemy.orm import declarative_base,sessionmakerBase = declarative_base()class User(Base):__tablename__ = 'users'id = Column(Integer, primary_key=True)name = Column(String)age = Column(Integer)created_at = Column(DateTime)engine = create_engine('mssql+pymssql://username:password@server/database?driver=SQL+Server+Native+Client+11.0')
Base.metadata.create_all(engine)Session = sessionmaker(bind=engine)
session = Session()# 插入数据
new_user = User(name='Alice', age=30, created_at=datetime.now())
session.add(new_user)
session.commit()# 删除数据
session.query(User).filter(User.id == 1).delete()
session.commit()# 更新数据
user_to_update = session.query(User).filter(User.id == 1).one()
user_to_update.name = 'Bob'
session.commit()# 查询数据
users = session.query(User).filter(User.id == 1).all()
for user in users:print(user)session.close()

from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.orm import declarative_base,sessionmaker# 设置数据库连接字符串
conn_str = 'sqlite:///examplesqlalchemy.db'# 创建数据库引擎
engine = create_engine(conn_str)# 创建基类
Base = declarative_base()# 定义用户表
class User(Base):__tablename__ = 'users'id = Column(Integer, primary_key=True)username = Column(String(50), unique=True, nullable=False)email = Column(String(100), nullable=False)# 创建数据库表
Base.metadata.create_all(engine)# 创建会话
Session = sessionmaker(bind=engine)
session = Session()# 插入数据
new_user = User(username='john_doe8', email='john@example.com')
session.add(new_user)
session.commit()# 插入数据
new_user2 = User(username='john_doe9', email='john2@example.com')
session.add(new_user2)
session.commit()# 查询数据
users = session.query(User).all()
for user in users:print(user.username, user.email)# 更新数据
user = session.query(User).filter_by(username='john_doe8').first()
user.email = 'john_updated@example.com'
session.commit()# 删除数据
user = session.query(User).filter_by(username='john_doe6').first()
session.delete(user)
session.commit()# 关闭会话
session.close()

总之,`MetaData` 对象和模型类在使用 SQLAlchemy 与 数据库进行交互时,有一些不同之处。`MetaData` 对象更适合在需要完全控制数据库表结构的情况下,而模型类更适合在需要对数据库表进行复杂查询和操作时。在实际应用中,您可以根据需要选择使用 `MetaData` 对象或模型类。

请注意,在运行此示例程序之前,需要确保已安装 SQLAlchemy 和 Pyodbc /create_engine('mssql+pymssql,并且已配置正确的数据库连接信息。
 

SQLAlchemy 1.4 库中的主要类及其重要方法:

Engine:

  • **create_engine():**创建一个指向数据库的引擎对象。
  • **execute():**执行一个 SQL 查询或命令。
  • **connect():**返回一个连接对象,用于执行查询和命令。

Session:

  • **sessionmaker():**创建一个会话工厂,用于生成会话对象。
  • init(bind):使用给定的引擎或连接对象初始化一个会话。
  • **add():**向会话添加一个新对象。
  • **query():**返回一个查询对象,用于检索数据库中的对象。
  • **commit():**将会话中的所有更改提交到数据库。
  • **rollback():**回滚会话中的所有更改。
  • **close():**关闭会话,释放所有资源。

Table:

  • Table(name, metadata, *columns):创建一个表对象,代表数据库中的一个表。
  • **insert():**返回一个插入语句对象,可用于向表中插入新行。
  • **update():**返回一个更新语句对象,可用于更新表中的行。
  • **delete():**返回一个删除语句对象,可用于从表中删除行。

MetaData:

  • **MetaData():**创建一个元数据对象,用于存储表定义和其他元数据。

Column:

  • **Column(name, type, *args, kwargs):创建列对象,代表表中的列。

查询对象:

  • **filter():**添加一个过滤条件到查询。
  • **order_by():**添加一个排序条件到查询。
  • **offset():**设置结果偏移量。
  • **limit():**设置结果限制。
  • **all():**检索所有匹配查询的结果。
  • **one():**检索与查询匹配的第一个结果。
  • **count():**返回与查询匹配的结果数。

其他类:

  • **orm.mapper():**将类映射到表,以便对象可以与数据库行进行交互。
  • **orm.relationship():**定义对象之间关系。
  • **event.listen():**注册一个事件监听器,以便在特定事件(例如对象创建或更新)发生时执行某个操作。

通过了解这些类及其方法,您可以使用 SQLAlchemy 1.4 有效地执行数据库操作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/778450.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

POSTGRESQL中时间戳的奥秘timestamptz

哈喽,大家好,我是木头左! 一、前言 在日常的数据库操作中,经常会遇到各种时间相关的数据类型,如DATE、TIME、TIMESTAMP等。这些时间类型的处理方式和精度差异,直接影响到对数据的查询和分析结果。今天&…

基于Echarts的超市销售可视化分析系统(数据+程序+论文)

本论文旨在研究Python技术和ECharts可视化技术在超市销售数据分析系统中的应用。本系统通过对超市销售数据进行分析和可视化展示,帮助决策层更好地了解销售情况和趋势,进而做出更有针对性的决策。本系统主要包括数据处理、数据可视化和系统测试三个模块。…

喝酸奶能长寿么?

进入二十一世纪,仍然有两件事情不能祛魅。一个是钻石恒久远一颗永流传的高明传销策略;一个是关于酸奶对人体的各种好处的大肆鼓吹。 我们依照最早最先的原则翻查酸奶有益健康的说法的起源。 1899年9月,俄罗斯微生物学家及免疫学家梅契尼科夫…

29.Python从入门到精通—Python3 面向对象继承 多继承 方法重写 类属性与方法

29.从入门到精通:Python3 面向对象继承 多继承 方法重写 类属性与方法 继承多继承方法重写类属性与方法 继承 在面向对象编程中,继承是指通过继承现有类的属性和方法来创建新类的过程。新类称为子类(或派生类),现有类…

ES学习日记(一)-------单节点安装启动

基于ES7.4.1编写,其实一开始用的最新的8.1,但是问题太多了!!!!不稳定,降到7.4 下载好的安装包上传到服务器或虚拟机,创建ES目录,命令mkdir -p /路径xxxx 复制安装包到指定路径并解压: tar zxvf elasticsearch-8.1.0-linux-x86_64.tar.gz -C /usr/local/es/ 进入bin目录安装,命…

工业智能物联网关如何助力工业防震减灾

地震灾害难以预料,一旦发生往往就损失重大。对于工业领域而言,地震灾害的影响不仅仅是对人员安全的威胁,还包括对生产设施的破坏、生产进程的中断以及伴生的持续性经济损失。 随着5G、大数据、物联网技术的发展,面向工业领域构建一…

CAPL如何使用socket套接字实现TCP通信(数据传输)

书接上回《CAPL如何使用socket套接字实现TCP通信(建立连接)》,当TCP建立连接后,就可以传输数据了。 不管是client还是server,都是使用相同的函数传输应用层数据。 tcpSend(clientSocket, "12345", 5);但这里有一点值得注意:server端传输数据的socket是serverD…

高效批量管理文件,轻松实现文件批量复制并覆盖相同文件名,轻松管理文件

亲爱的用户们,您是否在批量复制文件时常常被相同文件名困扰,手动一个个改名繁琐又费时?现在,我们为您推出一款智能的文件批量改名工具,帮助您轻松处理复制时的相同文件名,让文件管理更从容! 首…

洗车行业在线预约提前下单小程序源码系统 带完整的安装代码包以及搭建教程

随着人们生活水平的提高,汽车保有量不断增加,洗车服务市场需求也日益旺盛。然而,传统的洗车服务方式往往存在排队等待时间长、服务质量不稳定等问题,给消费者带来了不便。因此,开发一款在线预约提前下单小程序&#xf…

基于java+springboot+vue实现的宠物美容机构CRM系统(文末源码+Lw+ppt)23-364

摘要 随着网络科技的不断发展以及人们经济水平的逐步提高,网络技术如今已成为人们生活中不可缺少的一部分,而信息管理系统是通过计算机技术,针对用户需求开发与设计,该技术尤其在各行业领域发挥了巨大的作用,有效地促…

C语言--编译和链接

1.翻译环境 计算机能够执行二进制指令,我们的电脑不会直接执行C语言代码,编译器把代码转换成二进制的指令; 我们在VS上面写下printf("hello world");这行代码的时候,经过翻译环境,生成可执行的exe文件&…

笔记81:在服务器中运行 Carla 报错 “Disabling core dumps.”

背景:使用实验室提供的服务器配 Carla-ROS2 联合仿真的实验环境,在安装好 Carla 后运行 ./CarlaUE4.sh 但是出现 Disabling core dumps. 报错,而且不会出现 Carla 的窗口; 解决:运行以下命令 ./CarlaUE4.sh -carl…

戴维南定理和诺顿定理的解题步骤

首先呢,由于戴维南定理和诺顿定理的思想基本相同,都是把电路进行等效替代,而且戴维南和诺顿可以互相转换,并且解题的时候最常用的还是戴维南定理,所以我们为了减少思考难度,同意用戴维南定理就可以了. 目录 用戴维南定理分析电路的基本步骤: 1.求开路电压U: 2.求等效电阻Req…

PetaLinux安装详解(Xilinx , linux, zynq, zynqMP)

1 概述 PetaLinux 工具提供在 Xilinx 处理系统上定制、构建和调配嵌入式 Linux 解决方案所需的所有组件。该解决方案旨在提升设计生产力,可与 Xilinx 硬件设计工具配合使用,以简化针对 Versal、Zynq™ UltraScale™ MPSoC、Zynq™ 7000 SoC、和 MicroBl…

【机器学习】包裹式特征选择之序列后向选择法

🎈个人主页:豌豆射手^ 🎉欢迎 👍点赞✍评论⭐收藏 🤗收录专栏:机器学习 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共同学习、交流进…

jvm(虚拟机)运行时数据区域介绍

Java虚拟机(JVM)运行时数据区域是Java程序在运行过程中使用的内存区域,它主要包括以下几个部分: 程序计数器(Program Counter Register): 程序计数器是一块较小的内存区域,是线程私有…

uniapp 中引入第三方组件后,更改组件的样式 -使用/deep/不生效

在我们使用Vue搭建项目的时候,我们经常会用到一些UI框架,如Element,iView,但是有时候我们又想去修改Ul框架的样式,当我们修改样式失败的时候,可以尝试一下/deep/,亲测有效。 那失败的原因是什么…

TCP/IP参考模型(四层及其解析)

文章目录 1、什么是TCP/IP2、四层协议2.1 应用层(应用程序协议)2.2 传输层(源端口↔️目的端口)2.3 网络层(主机↔️主机)2.4 网络接口层(主机↔️网络层) 总结 1、什么是TCP/IP TC…

STM32 串口 DMA 接收不定长数据的一种方法

1. 前言 使用串口接收不定长数据时,可以有多种方法,比如最常见的有额外使能一个定时器,在超过定时范围未收到后续的字节时,认为此帧结束;或者利用 IDLE 中断,当数据空闲时,自动产生中断&#x…

SpringCloud实用篇(一)

1.SpringCloud SpringCloud是目前国内使用最广泛的微服务框架。官网地址:Spring Cloud SpringCloud集成了各种微服务功能组件,并基于SpringBoot实现了这些组件的自动装配,从而提供了良好的开箱即用体验: SpringCloud与SpringBoo…