SQLAlchemy映射表结构和对数据的CRUD

简介: SQLAlchemy映射表结构和对数据的CRUD

ORM模型映射到数据库中

declarative_base根据engine创建一个ORM基类

from sqlalchemy.ext.declarative import declarative_base
engine = create_engine(DB_URI)
Base = declarative_base(engine)

用这个Base类作为基类来写自己的ORM类。要定义__tablename__类属性,来指定这个模型映射到数据库中的表名

class Person(Base):
  __tablename__ ='t_person'

创建属性来映射到表中的字段,所有需要映射到表中的属性都应该为Column类型

class Person(Base):
  __tablename__ ='t_person'
  # 在这个ORM模型中创建一些属性,来跟表中的字段进行一一映射。
  # 这些属性必须是sqlalchemy给我们提供好的数据类型
  id = Column(Integer,primary_key=True,autoincrement=True)
  name = Column(String(50))
  age = Column(Integer)
  country = Column(String(50))

使用Base.metadata.create_all()来将模型映射到数据库中

Base.metadata.create_all()

注意

一旦使用Base.metadata.create_all()将模型映射到数据库中后,即使改变了模型的字段,也不会重新映射了

构建session对象

所有和数据库的ORM操作都必须通过一个叫做session的会话对象来实现,通过以下代码来获取会话对象

from sqlalchemy.orm import sessionmaker
engine = create_engine(DB_URI)
Base = declarative_base(engine)
session = sessionmaker(engine)()
  1. from sqlalchemy.orm import sessionmaker: 这行代码导入了sessionmaker,它是用于创建会话(session)的工厂函数。
  2. engine = create_engine(DB_URI): 这行代码使用了之前构建的数据库连接字符串(DB_URI)来创建了一个数据库引擎(engine)。
  3. Base = declarative_base(engine): 这行代码使用了declarative_base函数来创建了一个基类(Base)。然而,请注意,在declarative_base函数中传递了一个参数engine,这将指定此基类使用的数据库引擎。
  4. session = sessionmaker(engine)(): 这行代码创建了一个会话(session)对象(session)。sessionmaker函数接受一个引擎作为参数,用于创建会话。注意后面的额外的一对括号(),它们实际上调用了sessionmaker返回的函数,以创建一个实际的会话对象。

 

添加对象

def create_data_one():
  with Session() as session:
    p1 = Person(name = '春秋',age = 6 , country='北京')
    session.add(p1)
    session.commit()
def create_data_many():
  with Session() as session:
    p2 = Person(name = '吕布',age = 19 , country='北京')
    p3 = Person(name = '貂蝉',age = 18 , country='北京')
    session.add_all([p2,p3])
    session.commit()

create_data_one() 函数:

  • 这个函数使用了一个上下文管理器(with Session() as session),它创建了一个会话对象 session
  • 在这个函数中,创建了一个名为 p1Person 对象,该对象具有名字、年龄和国家信息。
  • 然后将 p1 添加到了会话中 (session.add(p1))。
  • 最后调用 session.commit() 来提交这个
  • 会话,将数据保存到数据库中。
  1. create_data_many()函数:
  • 同样地,这个函数也使用了上下文管理器来
  • 创建一个会话对象 session
  • 在这个函数中,创建了两个名为 p2p3Person 对象,分别代表了两个不同的人员信息。
  • 使用 session.add_all([p2, p3]) 一次性将这两
  • 个对象添加到会话中。
  • 最后调用 session.commit() 来提交这个会话,将数据保存到数据库中。

查找对象

def query_data_all():
  with Session() as session:
    all_person = session.query(Person).all()
    for p in all_person:
      print(p.name)
def query_data_one():
  with Session() as session:
    p1 = session.query(Person).first()
    print(p1.name)
def query_data_by_params():
  with Session() as session:
    # p1 = session.query(Person).filter_by(name='吕布').first()
    p1 = session.query(Person).filter(Person.name == '吕布').first()
    print(p1.age)

query_data_all() 函数:

  • 使用上下文管理器创建了一个会话对象 session。
  • 使用 session.query(Person).all() 查询了所有的 Person 对象,并将它们以列表的形式返回给变量 all_person。
  • 然后通过一个循环遍历了所有
  • 的人员,并打印了他们的名字。
  1. query_data_one()函数:
  • 同样地,使用上下文管理器创建了一个会话对象 session。
  • 使用 session.query(Person).first() 查询了第一个 Person 对象,并将其赋给了变量 p1。
  • 最后打印了 p1 对象的名字。
  1. query_data_by_params() 函数:
  • 这个函数演示了如何通过特定的条件来查询数据。
  • 使用了上下文管理器创建了一个会话对象 session。
  • 通过 session.query(Person).filter(Person.name == '吕布').first() 查询了名字为 '吕布' 的第一个 Person 对
  • 象,并将其赋给了变量 p1
  • 最后打印了 p1 对象的年龄。

 

修改对象

def delete_data():
  with Session() as session:
    p1 = session.query(Person).filter(Person.name == '貂蝉').first()
    session.delete(p1)
    session.commit()

1.使用上下文管理器创建了一个会话对象 session。


2.使用 session.query(Person).filter(Person.name == '貂蝉').first() 查询了名字为 '貂蝉' 的第一个 Person 对象,并将其赋给了变量 p1。


3.使用 session.delete(p1) 删除了 p1 对象,即删除了名字为 '貂蝉' 的人员信息。


4.最后,通过 session.commit() 提交了事务,将删除操作保存到数据库中。


相关文章
|
2月前
|
存储 人工智能 Cloud Native
云栖重磅|从数据到智能:Data+AI驱动的云原生数据库
在9月20日2024云栖大会上,阿里云智能集团副总裁,数据库产品事业部负责人,ACM、CCF、IEEE会士(Fellow)李飞飞发表《从数据到智能:Data+AI驱动的云原生数据库》主题演讲。他表示,数据是生成式AI的核心资产,大模型时代的数据管理系统需具备多模处理和实时分析能力。阿里云瑶池将数据+AI全面融合,构建一站式多模数据管理平台,以数据驱动决策与创新,为用户提供像“搭积木”一样易用、好用、高可用的使用体验。
云栖重磅|从数据到智能:Data+AI驱动的云原生数据库
|
2月前
|
存储 监控 数据处理
flink 向doris 数据库写入数据时出现背压如何排查?
本文介绍了如何确定和解决Flink任务向Doris数据库写入数据时遇到的背压问题。首先通过Flink Web UI和性能指标监控识别背压,然后从Doris数据库性能、网络连接稳定性、Flink任务数据处理逻辑及资源配置等方面排查原因,并通过分析相关日志进一步定位问题。
197 61
|
6天前
|
SQL 存储 运维
从建模到运维:联犀如何完美融入时序数据库 TDengine 实现物联网数据流畅管理
本篇文章是“2024,我想和 TDengine 谈谈”征文活动的三等奖作品。文章从一个具体的业务场景出发,分析了企业在面对海量时序数据时的挑战,并提出了利用 TDengine 高效处理和存储数据的方法,帮助企业解决在数据采集、存储、分析等方面的痛点。通过这篇文章,作者不仅展示了自己对数据处理技术的理解,还进一步阐释了时序数据库在行业中的潜力与应用价值,为读者提供了很多实际的操作思路和技术选型的参考。
19 1
|
11天前
|
存储 Java easyexcel
招行面试:100万级别数据的Excel,如何秒级导入到数据库?
本文由40岁老架构师尼恩撰写,分享了应对招商银行Java后端面试绝命12题的经验。文章详细介绍了如何通过系统化准备,在面试中展示强大的技术实力。针对百万级数据的Excel导入难题,尼恩推荐使用阿里巴巴开源的EasyExcel框架,并结合高性能分片读取、Disruptor队列缓冲和高并发批量写入的架构方案,实现高效的数据处理。此外,文章还提供了完整的代码示例和配置说明,帮助读者快速掌握相关技能。建议读者参考《尼恩Java面试宝典PDF》进行系统化刷题,提升面试竞争力。关注公众号【技术自由圈】可获取更多技术资源和指导。
|
14天前
|
前端开发 JavaScript 数据库
获取数据库中字段的数据作为下拉框选项
获取数据库中字段的数据作为下拉框选项
44 5
|
2月前
|
SQL 关系型数据库 数据库
国产数据实战之docker部署MyWebSQL数据库管理工具
【10月更文挑战第23天】国产数据实战之docker部署MyWebSQL数据库管理工具
173 4
国产数据实战之docker部署MyWebSQL数据库管理工具
|
2月前
|
关系型数据库 MySQL 数据库
GBase 数据库如何像MYSQL一样存放多行数据
GBase 数据库如何像MYSQL一样存放多行数据
|
2月前
|
关系型数据库 分布式数据库 数据库
云栖大会|从数据到决策:AI时代数据库如何实现高效数据管理?
在2024云栖大会「海量数据的高效存储与管理」专场,阿里云瑶池讲师团携手AMD、FunPlus、太美医疗科技、中石化、平安科技以及小赢科技、迅雷集团的资深技术专家深入分享了阿里云在OLTP方向的最新技术进展和行业最佳实践。
|
3月前
|
人工智能 Cloud Native 容灾
云数据库“再进化”,OB Cloud如何打造云时代的数据底座?
云数据库“再进化”,OB Cloud如何打造云时代的数据底座?
|
3月前
|
NoSQL 前端开发 MongoDB
前端的全栈之路Meteor篇(三):运行在浏览器端的NoSQL数据库副本-MiniMongo介绍及其前后端数据实时同步示例
MiniMongo 是 Meteor 框架中的客户端数据库组件,模拟了 MongoDB 的核心功能,允许前端开发者使用类似 MongoDB 的 API 进行数据操作。通过 Meteor 的数据同步机制,MiniMongo 与服务器端的 MongoDB 实现实时数据同步,确保数据一致性,支持发布/订阅模型和响应式数据源,适用于实时聊天、项目管理和协作工具等应用场景。

热门文章

最新文章