展开菜单
首页 精品内容 本月促销 装机必备 Windows PDF教程 macOS软件 IOS软件 Android AI 专题
全部分类

当前位置:

首页 > 编程开发 > FastAPI连接Oracle数据库教程

FastAPI连接Oracle数据库教程

本教程详细阐述了如何使用FastAPI和SQLAlchemy连接并查询Oracle数据库中已存在的表。文章首先澄清了Base.metadata.create_all()在处理现有表时的默认行为,随后重点介绍了通过SQLAlchemy的反射机制,以声明式映射方式优雅地将Python模型与现有数据库表进行关联,并提供了完整的FastAPI接口示例,确保开发者能够高效、准确地操作现有数据库资产。

本文目录

    使用FastAPI与SQLAlchemy连接现有Oracle数据库表的教程

    本教程详细阐述了如何使用FastAPI和SQLAlchemy连接并查询Oracle数据库中已存在的表。文章首先澄清了`Base.metadata.create_all()`在处理现有表时的默认行为,随后重点介绍了通过SQLAlchemy的反射机制,以声明式映射方式优雅地将Python模型与现有数据库表进行关联,并提供了完整的FastAPI接口示例,确保开发者能够高效、准确地操作现有数据库资产。

    在现代Web应用开发中,特别是在构建微服务架构时,经常需要与已有的数据库进行交互。FastAPI因其高性能、易用性和自动文档生成能力,成为构建API的流行选择。而SQLAlchemy作为Python中最强大、最灵活的ORM(对象关系映射)工具之一,能有效管理数据库交互。本文将聚焦于一个常见但可能令人困惑的场景:如何使用FastAPI和SQLAlchemy连接并查询Oracle数据库中已存在的表,并解决开发者可能遇到的关于Base.metadata.create_all()的疑问。

    理解 Base.metadata.create_all() 的默认行为

    许多开发者在使用SQLAlchemy时,习惯于在定义模型后调用Base.metadata.create_all(bind=engine)来创建数据库表。然而,当数据库中表已存在时,会担心此操作是否会引发错误或重新创建表。

    实际上,Base.metadata.create_all() 方法有一个关键参数 checkfirst,其默认值为 True。这意味着在尝试创建任何表之前,SQLAlchemy会首先检查该表是否已存在于数据库中。如果表已存在,它将跳过创建操作,从而避免了重复创建表可能导致的错误。因此,对于一个已存在的表,即使调用create_all,通常也不会导致问题。

    以下是原始代码片段,它在处理现有表时并不会出错:

    from sqlalchemy import create_engine
    from sqlalchemy.ext.declarative import declarative_base
    from sqlalchemy.orm import sessionmaker, Session
    import cx_Oracle
    
    from fastapi import Depends, FastAPI
    from sqlalchemy import Column, Integer, String
    
    # 初始化Oracle客户端 (路径需根据实际情况配置)
    # cx_Oracle.init_oracle_client(lib_dir=r"E:\instantclient-basic-windows.x64-12.1.0.2.0\instantclient_12_1")
    
    # 数据库连接字符串
    my_database_connection = "oracle+cx_oracle://super:password@localhost:1521/db" # 请替换为您的实际连接信息
    
    engine = create_engine(my_database_connection)
    SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
    Base = declarative_base()
    
    class table1(Base):
        __tablename__ = "table1"
        # 假设CN是主键,或者有唯一约束
        CN = Column(String(length=256), primary_key=True) # 假设CN是主键
        NAME = Column(String(length=40))
        EMAIL = Column(String(length=20))
    
    # 即使table1已存在,此行也不会重新创建它,因为checkfirst=True是默认行为
    Base.metadata.create_all(bind=engine) 
    
    app = FastAPI()
    
    def get_db():
        db = SessionLocal()
        try:
            yield db
        finally:
            db.close()
    
    @app.get("/table_api/")
    def read_users(db:Session = Depends(get_db)):
        cninformation = db.query(table1).all()
        return cninformation

    尽管上述代码在功能上是正确的,但对于处理现有数据库表,SQLAlchemy提供了更明确和专业的“反射”机制。

    声明式映射与现有表的反射机制

    当数据库结构已由DBA管理或由其他系统生成时,我们通常不希望ORM去创建或修改表结构。此时,SQLAlchemy的反射机制允许我们“映射”到已存在的数据库表,而不是通过Python模型来定义它们。

    以下是使用反射机制来连接和查询现有Oracle表的详细步骤及示例代码:

    1. 初始化Oracle客户端与数据库连接

    确保cx_Oracle库已安装,并且Oracle Instant Client已配置。cx_Oracle.init_oracle_client函数用于指定Instant Client的路径。

    import cx_Oracle
    # 请根据您的Oracle Instant Client实际安装路径进行配置
    # cx_Oracle.init_oracle_client(lib_dir=r"E:\instantclient-basic-windows.x64-12.1.0.2.0\instantclient_12_1")

    然后,配置数据库连接字符串并创建SQLAlchemy的引擎和会话工厂。

    from sqlalchemy import create_engine, Column, String, Table, MetaData
    from sqlalchemy.ext.declarative import declarative_base
    from sqlalchemy.orm import sessionmaker, Session
    from fastapi import Depends, FastAPI
    
    # 数据库连接配置
    # 格式: oracle+cx_oracle://user:password@host:port/service_name
    # 或者 oracle+cx_oracle://user:password@tnsname
    my_database_connection = "oracle+cx_oracle://super:password@localhost:1521/db" # 替换为您的实际连接信息
    engine = create_engine(my_database_connection)
    
    # 创建数据库会话工厂
    SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
    
    # 创建声明式基类
    Base = declarative_base()
    
    # 创建MetaData对象,用于管理数据库元数据和反射表结构
    metadata = MetaData() 

    2. 定义反射模型

    与直接声明模型不同,反射模型通过Table对象来映射现有表。我们使用Table('your_table_name', metadata, autoload_with=engine)来指示SQLAlchemy从数据库中加载指定表的结构。

    class Table1(Base):
        __tablename__ = "table1" # 数据库中的实际表名
    
        # 关键:通过反射机制加载表结构
        # autoload_with=engine 会指示SQLAlchemy连接到数据库并加载'table1'的列信息
        __table__ = Table(__tablename__, metadata, autoload_with=engine) 
    
        # 如果需要,可以在这里定义额外的Python属性或方法
        # 例如,定义一个 __repr__ 方法方便调试
        def __repr__(self):
            # 假设CN是表中的一个列,通过反射获得
            return f""

    说明:

    • __tablename__ 仍然用于指定数据库中的表名。
    • __table__ = Table(__tablename__, metadata, autoload_with=engine) 是反射的关键。它告诉SQLAlchemy,这个Python类Table1应该映射到数据库中名为table1的表,并且其列结构应该通过engine从数据库中自动加载。
    • 一旦__table__被反射,您就不需要在Python类中手动定义所有列(如CN = Column(...)),因为这些信息将自动从数据库中获取。

    3. 构建FastAPI应用与查询接口

    现在,我们可以将反射模型集成到FastAPI应用中,并定义API接口来查询数据。

    app = FastAPI()
    
    # 数据库会话依赖函数
    def get_db():
        db = SessionLocal()
        try:
            yield db
        finally:
            db.close()
    
    # 定义API接口
    @app.get("/table_api/")
    def read_table_data(db: Session = Depends(get_db)):
        """
        查询table1表的所有数据。
        """
        # 使用反射模型Table1进行查询
        data = db.query(Table1).all()
        return data
    
    # 运行FastAPI应用
    # 可以通过命令行运行:uvicorn your_script_name:app --reload
    # 假设您的脚本名为 main.py,则运行:uvicorn main:app --reload

    完整示例代码

    将上述所有部分整合,形成一个完整的FastAPI应用,用于查询Oracle数据库中的现有表:

    from sqlalchemy import create_engine, Table, MetaData
    from sqlalchemy.ext.declarative import declarative_base
    from sqlalchemy.orm import sessionmaker, Session
    import cx_Oracle
    from fastapi import Depends, FastAPI
    
    # --- 1. 初始化Oracle客户端 (根据您的实际环境配置) ---
    # cx_Oracle.init_oracle_client(lib_dir=r"E:\instantclient-basic-windows.x64-12.1.0.2.0\instantclient_12_1")
    
    # --- 2. 数据库连接配置 ---
    # 请替换为您的实际Oracle数据库连接信息
    my_database_connection = "oracle+cx_oracle://super:password@localhost:1521/db" 
    engine = create_engine(my_database_connection)
    
    # 创建数据库会话工厂
    SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
    
    # 创建声明式基类和MetaData对象
    Base = declarative_base()
    metadata = MetaData() 
    
    # --- 3. 定义反射模型 ---
    class Table1(Base):
        __tablename__ = "table1" # 数据库中的实际表名
        # 通过反射机制加载表结构
        __table__ = Table(__tablename__, metadata, autoload_with=engine) 
    
        def __repr__(self):
            # 假设CN, NAME, EMAIL是表中的列,通过反射获得
            return f""
    
    # --- 4. FastAPI应用初始化 ---
    app = FastAPI()
    
    # --- 5. 数据库会话依赖函数 ---
    def get_db():
        db = SessionLocal()
        try:
            yield db
        finally:
            db.close()
    
    # --- 6. 定义API接口 ---
    @app.get("/table_api/")
    def read_table_data(db: Session = Depends(get_db)):
        """
        查询table1表的所有数据。
        """
        data = db.query(Table1).all()
        return data
    
    # --- 7. 运行FastAPI应用 (通过命令行) ---
    # 将此代码保存为例如 main.py
    # 在命令行中运行:uvicorn main:app --reload
    # 然后访问 http://127.0.0.1:8000/table_api/ 查看结果

    注意事项与最佳实践

    1. cx_Oracle客户端路径: 确保cx_Oracle.init_oracle_client中的lib_dir指向正确的Oracle Instant Client路径。在生产环境中,可能需要确保环境变量(如LD_LIBRARY_PATH或PATH)已正确配置,以便系统能找到Oracle客户端库。
    2. 数据库连接字符串安全: 数据库密码等敏感信息绝不应硬编码在代码中。应通过环境变量、配置文件(如.env文件配合python-dotenv)或密钥管理服务来安全地管理这些凭据。
    3. 模型命名规范: Python类名通常使用驼峰命名法(如Table1),而数据库表名通常是小写或下划线命名(如table1)。保持这种约定有助于代码的可读性。
    4. 反射的优势: 当数据库结构由DBA管理或可能频繁变更时,反射机制能让ORM模型自动适应这些变化,减少手动维护模型定义的开销,提高系统的健壮性。
    5. 错误处理: 在实际应用中,应添加更完善的错误处理机制,例如数据库连接失败、查询无结果、权限不足等情况,以提供友好的用户体验和更稳定的服务。
    6. 多表反射: 如果有多个表需要反射,可以为每个表创建相应的反射模型类,遵循相同的模式。
    7. 主键和索引: 虽然反射会自动加载列信息,但SQLAlchemy通常需要知道表的主键才能执行某些ORM操作(如按ID查询)。反射通常会正确识别主键。如果反射未正确识别,您可能需要在模型中显式指定。

    总结

    本文详细介绍了在FastAPI应用中,如何利用SQLAlchemy连接并查询Oracle数据库中已存在的表。我们首先澄清了Base.metadata.create_all()在处理现有表时的默认行为,即其checkfirst=True的默认设置会避免重复创建表。随后,我们重点讲解了通过声明式映射结合反射机制来优雅地处理现有数据库表,这种方式更符合操作现有数据库的专业实践。通过掌握这些方法,开发者可以避免重复定义已有的表结构,使代码更加健壮和易于维护,从而更高效地开发与现有数据库集成的FastAPI应用。

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    编程开发
    相关文章 更多
    精品专题 更多
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    macOS软件

    正软商城macOS软件专区,精选适用于Mac电脑的办公、设计、影音、效率、开发和系统工具,提供软件功能介绍、macOS兼容版本、正版授权及购买下载服务。

    IOS软件

    正软商城iOS软件专区,精选适用于iPhone和iPad的办公、学习、影音、设计、效率及AI应用,提供功能介绍、适用设备、系统要求和正版获取方式等信息。

    AI

    正软商城AI软件专区,汇集AI写作、AI绘画、AI视频、AI办公、AI编程、AI翻译、智能客服和数据分析等人工智能工具,提供功能介绍、适用平台、收费方式及正版购买信息。

    Mac软件 更多
    Postman macOS版
    Postman macOS版

    Postman是一套面向API全生命周期的开发与测试平台,可在Mac上发送和调试多种协议请求,管理集合、环境及认证信息,并完成脚本测试、模拟服务、监控、文档发布和团队协作。它适合开发、测试及运维人员使用,提供个人免费方案。

    Docker Desktop macOS版
    Docker Desktop macOS版

    Docker Desktop 是 Docker 官方为 Mac 提供的容器开发环境,集成 Docker Engine、命令行工具、Compose、Build、Kubernetes 与图形化管理界面。

    Android Studio macOS版
    Android Studio macOS版

    Android Studio 是 Google 面向安卓应用开发提供的官方集成开发环境,基于 IntelliJ IDEA 构建。它整合智能代码编辑、Gradle 构建、界面预览、设备模拟、性能分析、调试测试及 APK 分析等工具。

    Xcode macOS版
    Xcode macOS版

    Xcode 是苹果面向 Mac 提供的官方集成开发环境,将代码编辑、项目构建、SwiftUI 实时预览、设备模拟、自动化测试、断点调试、性能分析和应用分发整合在同一套工作流中,适合开发与维护 iPhone、iPad、Mac、Apple Wa

    JetBrains WebStorm macOS版
    JetBrains WebStorm macOS版

    JetBrains WebStorm 是面向 JavaScript、TypeScript 和现代 Web 技术的专业集成开发环境,可智能理解项目结构,提供代码补全、重构、错误检查、运行调试、测试及 Git 工具。

    PhpStorm macOS版
    PhpStorm macOS版

    PhpStorm 是 JetBrains 推出的专业 PHP 集成开发环境,可在 Mac 上完成代码编写、智能检查、重构、调试、测试和数据库管理。它支持主流 PHP 框架、Composer、Git、Docker 与远程解释器。

    JetBrains PyCharm macOS版
    JetBrains PyCharm macOS版

    JetBrains PyCharm 是面向 Python 开发者的集成开发环境,提供智能补全、代码检查、重构、调试、测试、版本控制及虚拟环境管理功能。Mac 版兼容 Intel 与 Apple 芯片,核心功能可免费使用。

    JetBrains IntelliJ IDEA macOS版
    JetBrains IntelliJ IDEA macOS版

    IntelliJ IDEA 是 JetBrains 推出的专业集成开发环境,重点服务于 Java、Kotlin 与 JVM 项目开发。软件集成代码补全、静态检查、重构、调试、测试、版本控制及构建工具,并可借助插件扩展语言和框架支持。

    Visual Studio Code macOS版
    Visual Studio Code macOS版

    Visual Studio Code 是微软提供的免费代码编辑器,支持 macOS,并为 Intel 与 Apple 芯片 Mac 提供适配版本。软件集代码编辑、调试、Git 源代码管理、集成终端和扩展市场于一体。

    REAPER macOS版
    REAPER macOS版

    REAPER是Cockos开发的数字音频工作站,提供多轨音频与MIDI录制、剪辑、处理、混音和母带制作工具。Mac版兼容Intel与Apple芯片,支持AU、VST、VST3、CLAP等插件格式,并提供高度可定制的工作流程。

    Adobe Audition macOS版
    Adobe Audition macOS版

    Adobe Audition 是面向播客、影视后期、音乐制作及内容创作者的专业音频工作站,提供波形精修、多轨录制与混音、频谱编辑、降噪修复、响度匹配和效果处理工具,并可与 Adobe Premiere 协同完成视频声音制作。

    Pro Tools macOS版
    Pro Tools macOS版

    Pro Tools 是 Avid 推出的专业数字音频工作站,覆盖多轨录音、无损剪辑、MIDI 编曲、插件处理、自动化混音及声音与画面同步等工作。它拥有 Intro、Artist、Studio 和 Ultimate 等方案。

    WINDOWS 更多
    PixPix 网页版
    PixPix 网页版

    PixPix 是面向品牌、卖家和内容团队的在线 AI 图片视频创作平台,提供图视频 Agent、无限画布、图片生成、视频生成、自然语言编辑及商品套图、产品精修和带货视频等电商工具。

    Postman Windows版
    Postman Windows版

    Postman 是面向 API 全生命周期的开发与协作平台。Windows 桌面版可用于构建和发送 HTTP、GraphQL、gRPC、WebSocket、MQTT 等请求,并提供环境变量、集合、脚本测试、模拟服务、监控、文档及团队工作区等

    Docker Desktop Windows版
    Docker Desktop Windows版

    Docker Desktop 为 Windows 开发者提供集成式容器环境,内置 Docker Engine、命令行工具、Compose、Build 与 Kubernetes 等组件,可在本机完成镜像构建、容器运行、日志查看和资源管理。

    Android Studio Windows版
    Android Studio Windows版

    Android Studio 是 Google 面向 Android 应用开发提供的官方集成开发环境,以 IntelliJ IDEA 为基础,集成智能代码编辑、Gradle 构建、设备模拟、界面预览、调试测试及性能分析工具,

    JetBrains WebStorm Windows版
    JetBrains WebStorm Windows版

    WebStorm 是 JetBrains 面向 JavaScript、TypeScript 和现代 Web 技术打造的集成开发环境。它提供项目级代码分析、智能补全、安全重构、导航搜索,并集成调试、测试、终端、Git 与常用前端工具,

    JetBrains PhpStorm Windows版
    JetBrains PhpStorm Windows版

    PhpStorm 是 JetBrains 面向 PHP 与现代 Web 开发打造的专业集成开发环境,提供代码补全、静态检查、重构、调试、测试、数据库、版本控制及前端语言支持。Windows 用户可直接下载安装程序,

    JetBrains PyCharm Windows版
    JetBrains PyCharm Windows版

    PyCharm 是 JetBrains 推出的 Python 集成开发环境,提供智能代码补全、错误检查、重构、调试、测试、Git、终端及 Jupyter Notebook 支持。统一版安装后可体验 30 天 Pro 功能,

    JetBrains IntelliJ IDEA Windows版
    JetBrains IntelliJ IDEA Windows版

    JetBrains IntelliJ IDEA 是以 Java、Kotlin 和 JVM 项目为核心的专业集成开发环境,提供智能补全、代码检查、安全重构、调试、测试、版本控制及构建工具集成。统一发行版的核心功能可免费用于商业和非商业项目,

    Visual Studio Code Windows版
    Visual Studio Code Windows版

    Visual Studio Code 是微软推出的免费代码编辑器,Windows 版集成智能补全、代码导航、调试、终端和版本控制,并可通过扩展添加语言、格式化及远程开发能力。它启动较快、配置灵活,

    REAPER Windows版
    REAPER Windows版

    REAPER 是 Cockos 推出的数字音频工作站,适用于录音、MIDI 编曲、音频编辑、混音、母带制作及声音设计。软件安装包小巧,支持多轨录制、灵活路由、自动化、第三方插件和脚本扩展,并提供完整功能的 60 天免费评估期。

    Adobe Audition Windows版
    Adobe Audition Windows版

    Adobe Audition 是面向播客、影视后期、广播与音乐制作的专业音频工作站,提供波形编辑、多轨混音、频谱分析、录音、降噪修复和效果处理等功能。Windows 版通过 Adobe Creative Cloud 安装和管理,

    Pro Tools Windows版
    Pro Tools Windows版

    Pro Tools 是 Avid 推出的专业数字音频工作站,提供多轨录音、音频剪辑、MIDI编曲、插件处理、自动化混音及影视声音制作能力。它适合音乐人、录音师、制作人和音频后期团队使用,并提供免费入门版、订阅方案及永久授权选择。