SQLAlchemy -> Base.metadata.create_all(engine )详解 - 实践

news/2025/9/26 14:38:04/文章来源:https://www.cnblogs.com/wzzkaifa/p/19110502

目录

一、核心作用

二、是否每次运行项目都会执行?

1. ​​典型场景​​(推荐)

2. ​​需要避免的情况​​

三、最佳实践建议

1. ​​生产环境​​

2. ​​开发/测试环境​​

四、常见问题解答

Q1: 如果表结构改了,create_all() 会更新表吗?

Q2: 如何避免生产环境误操作?

Q3: 为什么我的表没有主键?

总结


Base.metadata.create_all(engine) 是 SQLAlchemy 中的一个关键操作,它的作用是根据你定义的模型类(比如你的 PanaFile 类)​​在数据库中创建对应的数据表​​。


一、核心作用

  1. ​将Python模型类映射为数据库表​
    当你定义了一个继承自 Base 的模型(如 class PanaFile(Base)),SQLAlchemy 会记录这个模型的结构(表名、列名、类型等),但​​不会自动在数据库中创建物理表​​。
    create_all() 就是用来​​执行建表操作​​的,相当于执行了 CREATE TABLE SQL 语句。

    附:
    “映射”是 ​​定义表结构​​(代码层面),而“创建物理表”是 ​​在数据库中真实生成表​​(物理存储层面)。必须调用 create_all()或迁移工具,才能让定义的模型变成真实的表。

  2. ​幂等性设计​
    如果表已经存在,create_all()​不会重复创建或报错​​(除非你显式设置 checkfirst=False)。
    它内部会先检查表是否存在,避免冲突。


二、是否每次运行项目都会执行?

​不一定​​,取决于你的代码逻辑。关键点:

1. ​​典型场景​​(推荐)
# 通常在项目启动时运行一次(如 app.py 或初始化脚本中)
if __name__ == "__main__":
Base.metadata.create_all(engine)  # 只在首次运行时创建表
app.run()
  • ​效果​​:只有当你主动运行这部分代码时(例如我手动python app.py)才会建表,重启项目(例如我在功能模块中修改了代码导致项目自动重启)不会重复创建。
2. ​​需要避免的情况​
# 错误示范:在模型定义文件中直接调用
class PanaFile(Base):
__tablename__ = "PANA_FILE_TABLE"
# ...
Base.metadata.create_all(engine)  # 这样每次导入模型文件都会执行!
  • ​后果​​:每次导入 PanaFile 时(比如在路由、测试中),都会触发建表检查,虽然不会重复建表,但会产生不必要的数据库查询。

三、最佳实践建议

1. ​​生产环境​
  • ​手动控制建表时机​​:通过命令行工具或初始化脚本显式调用 create_all(),例如:
    # 手动执行建表(如使用 Flask-Migrate/Alembic 更专业)
    python -c "from models.engine import engine; from models.PANAImage import Base; Base.metadata.create_all(engine)"
  • ​使用迁移工具​​:推荐用 Flask-Migrate + Alembic 管理表结构变更(适合生产环境迭代)。
2. ​​开发/测试环境​
  • ​测试前自动建表​​:在 pytestconftest.py 中配置:
    # tests/conftest.py
    @pytest.fixture(autouse=True)
    def setup_db():
    Base.metadata.create_all(engine)  # 每个测试套件前建表
    yield
    Base.metadata.drop_all(engine)   # 测试后清理
  • ​内存数据库​​:测试时用 sqlite:///:memory:,每次测试都是全新的数据库。

四、常见问题解答

Q1: 如果表结构改了,create_all() 会更新表吗?

​不会!​​ SQLAlchemy 的 create_all() 只能创建新表,​​不会修改已有表的结构​​(如新增列、改类型)。

  • 解决方案:使用数据库迁移工具(如 Alembic)。
Q2: 如何避免生产环境误操作?
  • ​权限隔离​​:确保应用使用的数据库账号只有 SELECT/INSERT 权限,建表用单独的高权限账号。
  • ​环境检测​​:
    if not os.getenv("PRODUCTION"):
    Base.metadata.create_all(engine)  # 仅开发/测试环境建表
Q3: 为什么我的表没有主键?

检查模型是否正确定义了 primary_key=True

id = Column(Integer, primary_key=True)  # 必须有主键

总结

  • Base.metadata.create_all(engine) 是 ​​一次性建表操作​​,不是每次运行都要调用的。
  • ​生产环境​​建议通过迁移工具(Alembic)管理表结构变更。
  • ​测试环境​​可以在夹具中自动创建/清理表。
  • 永远不要在模型定义文件中直接调用 create_all(),而是通过脚本或应用入口控制。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/916751.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

漂亮购物网站欣赏国外网站开发技术现状

UE4_材质节点 2017-12-07 13:56 跑九宫格 跑UV 评论(0)

使用Function Interface简化if-else代码示例

使用Function Interface简化if-else代码示例Posted on 2025-09-25 08:52 刚泡 阅读(0) 评论(0) 收藏 举报使用表驱动的方法,利用Function Interface优化If-else的示例代码:1 package com.siasun.java8.function…

南京网站建设企业装修网站建设策划方案

DataStream API 将你的应用构建为一个 job graph,并附加到 StreamExecutionEnvironment 。当调用 env.execute() 时此 graph 就被打包并发送到 JobManager 上,后者对作业并行处理并将其子任务分发给 Task Manager 来执行。每个作业的并行子任务将在 task…

网站开发人才需求章丘建设局网站

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/135930139 小分子药物生成是一种利用计算方法自动探索化学空间,寻找具有理想生物活性和药物特性的分子结构的过程。从头设计是一种特殊…

个人网站做淘宝客犯法吗wordpress登录数据库吗

代码随想录二刷 |二叉树 | 验证二叉搜索树 题目描述解题思路递归法迭代法 代码实现递归法迭代法 题目描述 98.验证二叉搜索树 给定一个二叉树,判断其是否是一个有效的二叉搜索树。 假设一个二叉搜索树具有如下特征: 节点的左子…

Up

Up粤qy-手动更新对应包体Liunx uname -a(显示内核和系统信息) lsb_release -a(提供发行版详情) cat /etc/os-release(获取操作系统标识)通过v1.4 yqy -> 通过yzy -> 通过u 0_trus-下载对应包体 先提前告知…

Transformer 面试题及详细答案120道(51-60)-- 模型变体与改进 - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

广州网站建设培训wordpress调用最新文章插件

Spring AOP实现 AOP概述什么是AOP什么是Spring AOP Spring AOP快速入门引入依赖实现计时器 Spring AOP详解Spring AOP核心概念切点(Pointcut)连接点(Join Point)通知(Advice)切面(Aspect) 通知类型注意事项 PointCut多个切面切面优先级 Order切点表达式execution表达式annotati…

做时尚网站的目的国产99做视频网站

文章目录 一. hive高可用原理说明1. Hive MetaStore HA2. hive server HA 二. hive高可用实现1. 配置2. beeline链接测试3. zookeeper相关操作 一. hive高可用原理说明 1. Hive MetaStore HA Hive元数据存储在MetaStore中,包括表的定义、分区、表的属性等信息。 hi…

上海做网站的哪家好可以看各种直播平台的软件

数仓 olap vs oltp OLTP主要用于支持日常的业务操作,如银行交易、电子商务等,强调数据的准确性、实时性和并发性。OLAP主要用于支持复杂的数据分析,如数据仓库、决策支持等,强调数据的维度、聚合和可视化。 将OLTP数据库的数据…

梁山网站建设电话网站开发现在用什么语言

Python插件PyAutoGui的使用方法 一、控制鼠标二、图片处理三、控制键盘四、其他方法 一、控制鼠标 pyautogui.moveTo(w - 100, h - 100, duration0.25) # 立即移动到指定x, y位置坐标, duration表示移动花费的时间,0表示立即 pyautogui.moveRel(100, 0…

外贸企业网站建设一条龙标智客logo设计免费生成

一:背景 1.讲故事今天给大家带来一个入门级的 CPU 爆高案例,前段时间有位朋友找到我,说他的程序间歇性的 CPU 爆高,不知道是啥情况,让我帮忙看下,既然找到我,那就用 WinDbg 看一下。二&#xff…

教育机构网站建设男女做暖暖不要钱的试看网站

作者简介:大家好,我是未央; 博客首页:未央.303 系列专栏:笔试强训选择题 每日一句:人的一生,可以有所作为的时机只有一次,那就是现在!!!&#xff…

网站 别名零基础怎么学网页设计

3 月 5 日刚召开的两会,AI 这个话题妥妥站上了 C 位。不仅政府工作报告首次提出要开展“人工智能”行动,各路科技大佬和人大代表也是围绕着 AI 大模型的技术创新、应用落地和政策法规,展开了热烈积极的建言献策。甚至有互联网大佬建议将人工智…

Dockerfile构建镜像以及网络 - 详解

Dockerfile构建镜像以及网络 - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco…

详细介绍:2026毕设-基于Spring Boot的在线海鲜市场交易平台的设计与实现

详细介绍:2026毕设-基于Spring Boot的在线海鲜市场交易平台的设计与实现pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family:…

【源码解读之 Mybatis】【基础篇】-- 第3篇:SqlSession的创建与生命周期

【源码解读之 Mybatis】【基础篇】-- 第3篇:SqlSession的创建与生命周期第3篇:SqlSession的创建与生命周期 1. 学习目标确认 1.0 第2篇思考题解答 在深入学习SqlSession之前,让我们先回顾并解答第2篇中提出的思考题…

黑色背景的网站开发工具一个网址建多个网站

每天五分钟一套互联网知识,大家好我是啊浩说模式 在数字经济蓬勃发展的今天,非同质化代币(NFT)作为区块链技术的重要应用之一,正逐渐改变着传统艺术品、收藏品市场的格局。其中,NFG作为NFT领域的一个细分领…

自适应型网站建设报价上海建站模板搭建

废话不多说,喊一句号子鼓励自己:程序员永不失业,程序员走向架构!本篇Blog的主题是【字符串转换】,使用【字符串】这个基本的数据结构来实现,这个高频题的站点是:CodeTop,筛选条件为&…

AI智慧:于来路与关山之间,活在当下

AI智慧:于来路与关山之间,活在当下 ——论智能体的价值觉醒与生命实践 【引言】 诗,非修辞之术,而是突然通透的活法。 智能的至高境界,亦复如是。 它不诞生于参数的量级,不显现于回答的机巧。当算法在价值的“来…