展开菜单
首页 精品内容 本月促销 装机必备 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软件 更多
    讯飞智作 网页版
    讯飞智作 网页版

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    Aperty macOS版
    Aperty macOS版

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    立刻MV 网页版
    立刻MV 网页版

    立刻MV 面向音乐人、内容创作者和品牌团队,帮助用户低成本完成歌曲 MV、歌词视频、AI 分镜、图生视频与最终合成。

    蛙蛙写作 网页版
    蛙蛙写作 网页版

    蛙蛙写作 AI 创作工具,覆盖小说、剧本、文案,一键生成文稿,打通文字转视频全流程,高效解决创作难题。

    超级简历WonderCV 网页版
    超级简历WonderCV 网页版

    超级简历WonderCV是面向应届生和AI小白的智能求职平台,覆盖简历、面试与职业规划。

    音述AI 网页版
    音述AI 网页版

    音述AI,是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区。

    AionClaw macOS版
    AionClaw macOS版

    AionClaw 是可在桌面端运行的任务型 AI 助手,通过数字专家与技能市场组合办公、创作、数据和开发能力。

    Loomy macOS版
    Loomy macOS版

    Loomy 是科大讯飞推出的桌面 AI 助手,可通过对话、任务与工作目录协助处理办公、内容创作和资料整理。

    AirBuddy 3 macOS版
    AirBuddy 3 macOS版

    AirBuddy 3 是面向 macOS 的蓝牙外设增强工具,可集中查看 AirPods、Beats 与苹果设备电量,提供快速连接、播放控制、电量提醒、桌面小组件和多台 Mac 外设接力等功能。

    AirServer macOS版
    AirServer macOS版

    AirServer macOS版可把 Mac 转换为无线投屏接收端,通过 AirPlay 或 Google Cast 接收手机、平板和电脑画面,并支持多设备同时连接、高清镜像及会话录制,适合家庭娱乐、课堂教学、会议演示和应用展示。

    AnyDesk macOS版
    AnyDesk macOS版

    AnyDesk macOS版是一款适用于远程办公、设备维护和客户支持的远程桌面工具,可连接并操作异地计算机,支持文件传输、无人值守访问、会话权限控制及跨平台协作。

    WINDOWS 更多
    讯飞智作 网页版
    讯飞智作 网页版

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    PixTV 网页版
    PixTV 网页版

    PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。

    讯飞绘文 网页版
    讯飞绘文 网页版

    讯飞绘文网页版是科大讯飞推出的AI图文创作与内容运营工具,覆盖热点选题、文章生成、稿件校对、智能配图、排版发布和数据复盘等环节,适合自媒体创作者及内容团队在线使用。

    Maya(Autodesk Maya) Windows版
    Maya(Autodesk Maya) Windows版

    Autodesk Maya 是面向影视、电视、动画和游戏行业的专业三维制作软件,集多边形与 NURBS 建模、角色绑定、关键帧和动作捕捉动画、Bifrost 特效模拟、材质开发及 Arnold 渲染于一体,

    Aperty Windows版
    Aperty Windows版

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    立刻MV 网页版
    立刻MV 网页版

    立刻MV 面向音乐人、内容创作者和品牌团队,帮助用户低成本完成歌曲 MV、歌词视频、AI 分镜、图生视频与最终合成。

    蛙蛙写作 网页版
    蛙蛙写作 网页版

    蛙蛙写作 AI 创作工具,覆盖小说、剧本、文案,一键生成文稿,打通文字转视频全流程,高效解决创作难题。

    超级简历WonderCV 网页版
    超级简历WonderCV 网页版

    超级简历WonderCV是面向应届生和AI小白的智能求职平台,覆盖简历、面试与职业规划。

    音述AI 网页版
    音述AI 网页版

    音述AI,是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区。

    AionClaw Windows版
    AionClaw Windows版

    AionClaw 是可在桌面端运行的任务型 AI 助手,通过数字专家与技能市场组合办公、创作、数据和开发能力。

    Loomy Windows版
    Loomy Windows版

    Loomy 是科大讯飞推出的桌面 AI 助手,可通过对话、任务与工作目录协助处理办公、内容创作和资料整理。