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,一经查实,立即删除!

相关文章

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

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

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、大数据、物联网技术的发展,面向工业领域构建一…

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

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

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

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

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

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

C语言--编译和链接

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

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/,亲测有效。 那失败的原因是什么…

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

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

SpringCloud实用篇(一)

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

Win10环境下使用Ollama搭建本地AI

前言: 1、Ollama需要安装0.1.27版本,高于这个版本在执行Ollama run 指令时会频繁触发一些奇奇怪怪的问题。 2、4.3篇章是重点,若你需要使用web访问的话,莫要忘记! 3、本文章适合新手。 4、篇章5中会介绍如何在vscode中…

探索PLC远程监控的未来:节约成本与提高效率的双赢之道

描述:随着工业自动化技术的飞速发展,PLC远程监控及程序上下载功能成为了行业的新宠,为企业节约成本,减少人员出差带来了革命性的改变。本文深入探讨了这一变革给自动化公司、客户和工程师带来的好处,以及谁是最大的受益…

基于TSINGSEE青犀AI视频智能分析技术的山区林区烟火检测方案

随着清明节的临近,山区、林区防火迫在眉睫,TSINGSEE青犀AI智能分析网关V4烟火检测算法利用物联网、人工智能、图像识别技术,有效监测和管理烟火活动,并在火灾发生的同时发出告警,通知护林员与管理人员。 将山区林区的视…

Leetcode 第 126 场双周赛题解

Leetcode 第 126 场双周赛题解 Leetcode 第 126 场双周赛题解题目1:3079. 求出加密整数的和思路代码复杂度分析 题目2:3080. 执行操作标记数组中的元素思路代码复杂度分析 题目3:3081. 替换字符串中的问号使分数最小思路代码复杂度分析 题目4…

[LeetCode]516. 最长回文子序列[记忆化搜索解法详解]

最长回文子序列 LeetCode 原题链接 题目 给你一个字符串 s ,找出其中最长的回文子序列,并返回该序列的长度。 子序列定义为:不改变剩余字符顺序的情况下,删除某些字符或者不删除任何字符形成的一个序列。 示例 1&#xff1a…

Day46:WEB攻防-注入工具SQLMAPTamper编写指纹修改高权限操作目录架构

目录 数据猜解-库表列数据&字典 权限操作-文件&命令&交互式 提交方法-POST&HEAD&JSON 绕过模块-Tamper脚本-使用&开发 分析拓展-代理&调试&指纹&风险&等级 知识点: 1、注入工具-SQLMAP-常规猜解&字典配置 2、注入…

【有芯职说】数字芯片BES工程师

一、 数字芯片BES工程师简介 今天来聊聊数字芯片BES工程师,其中BES是Back End Support的缩写,就是后端支持的意思。其实这个岗位是数字IC前端设计和数字IC后端设计之间的一座桥,完成从寄存器传输级设计到具体工艺的mapping和实现。这个岗位在…