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() 提交了事务,将删除操作保存到数据库中。


相关文章
|
1月前
|
SQL 关系型数据库 数据库
Python SQLAlchemy模块:从入门到实战的数据库操作指南
免费提供Python+PyCharm编程环境,结合SQLAlchemy ORM框架详解数据库开发。涵盖连接配置、模型定义、CRUD操作、事务控制及Alembic迁移工具,以电商订单系统为例,深入讲解高并发场景下的性能优化与最佳实践,助你高效构建数据驱动应用。
259 7
|
4月前
|
存储 JSON 关系型数据库
【干货满满】解密 API 数据解析:从 JSON 到数据库存储的完整流程
本文详解电商API开发中JSON数据解析与数据库存储的全流程,涵盖数据提取、清洗、转换及优化策略,结合Python实战代码与主流数据库方案,助开发者构建高效、可靠的数据处理管道。
|
2月前
|
数据采集 关系型数据库 MySQL
python爬取数据存入数据库
Python爬虫结合Scrapy与SQLAlchemy,实现高效数据采集并存入MySQL/PostgreSQL/SQLite。通过ORM映射、连接池优化与批量提交,支持百万级数据高速写入,具备良好的可扩展性与稳定性。
|
2月前
|
人工智能 Java 关系型数据库
使用数据连接池进行数据库操作
使用数据连接池进行数据库操作
107 11
|
3月前
|
存储 数据管理 数据库
数据字典是什么?和数据库、数据仓库有什么关系?
在数据处理中,你是否常困惑于字段含义、指标计算或数据来源?数据字典正是解答这些问题的关键工具,它清晰定义数据的名称、类型、来源、计算方式等,服务于开发者、分析师和数据管理者。本文详解数据字典的定义、组成及其与数据库、数据仓库的关系,助你夯实数据基础。
数据字典是什么?和数据库、数据仓库有什么关系?
|
7月前
|
存储 缓存 数据库
数据库数据删除策略:硬删除vs软删除的最佳实践指南
在项目开发中,“删除”操作常见但方式多样,主要分为硬删除与软删除。硬删除直接从数据库移除数据,操作简单、高效,但不可恢复;适用于临时或敏感数据。软删除通过标记字段保留数据,支持恢复和审计,但增加查询复杂度与数据量;适合需追踪历史或可恢复的场景。两者各有优劣,实际开发中常结合使用以满足不同需求。
653 4
|
3月前
|
存储 关系型数据库 数据库
【赵渝强老师】PostgreSQL数据库的WAL日志与数据写入的过程
PostgreSQL中的WAL(预写日志)是保证数据完整性的关键技术。在数据修改前,系统会先将日志写入WAL,确保宕机时可通过日志恢复数据。它减少了磁盘I/O,提升了性能,并支持手动切换日志文件。WAL文件默认存储在pg_wal目录下,采用16进制命名规则。此外,PostgreSQL提供pg_waldump工具解析日志内容。
316 0
|
5月前
|
存储 SQL Java
数据存储使用文件还是数据库,哪个更合适?
数据库和文件系统各有优劣:数据库读写性能较低、结构 rigid,但具备计算能力和数据一致性保障;文件系统灵活易管理、读写高效,但缺乏计算能力且无法保证一致性。针对仅需高效存储与灵活管理的场景,文件系统更优,但其计算短板可通过开源工具 SPL(Structured Process Language)弥补。SPL 提供独立计算语法及高性能文件格式(如集文件、组表),支持复杂计算与多源混合查询,甚至可替代数据仓库。此外,SPL 易集成、支持热切换,大幅提升开发运维效率,是后数据库时代文件存储的理想补充方案。
|
8月前
|
数据库 Python
【YashanDB知识库】python驱动查询gbk字符集崖山数据库CLOB字段,数据被驱动截断
【YashanDB知识库】python驱动查询gbk字符集崖山数据库CLOB字段,数据被驱动截断

热门文章

最新文章