鱼C论坛

 找回密码
 立即注册
查看: 30|回复: 3

请问flask里 ORM模型迁移问题?

[复制链接]
发表于 昨天 19:38 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
你好请问ORM模型迁移可以迁移二次吗?,我第二次迁移也成功了,但是SQL数据里没有添加进表。
还有PyCharm里自己写的模型导入的时候导不进来,就是会报错: from  models import EmailCaptchaModel
ImportError: cannot import name 'EmailCaptchaModel' from 'models' (D:\Python\Project Development\demo09\models.py)
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 昨天 19:39 | 显示全部楼层
关于Flask的ORM迁移和导入问题,以下是解答:

问题1:ORM模型迁移可以多次执行吗?为什么第二次迁移后数据库没新表?

可以多次迁移,每次修改模型后都需要重新生成迁移脚本并应用\

常见原因及解决:
  • 未执行upgrade命令:执行完
    1. flask db migrate
    复制代码
    后,必须再执行
    1. flask db upgrade
    复制代码
    才能生效
  • 模型未注册:确保在
    1. models.py
    复制代码
    中正确定义了新模型,并在执行迁移前导入到应用实例中(在创建
    1. Migrate
    复制代码
    对象前导入)
  • 迁移脚本冲突:检查
    1. migrations/versions
    复制代码
    下的脚本,确认新生成的脚本包含创建表的操作(用文本编辑器打开查看)


问题2:导入模型报错 ImportError

检查文件结构:确认项目目录结构如下(
  1. models.py
复制代码
与主程序同级):

  1. project_folder/
  2. ├── app.py          # 主程序
  3. ├── models.py       # 模型定义文件
  4. └── migrations/     # 迁移文件夹(自动生成)
复制代码

验证类名拼写:在
  1. models.py
复制代码
中检查是否正确定义了类:

  1. class EmailCaptchaModel(db.Model):  # 确保类名完全一致
  2.     __tablename__ = "email_captcha"
  3.     id = db.Column(db.Integer, primary_key=True)
  4.     ...  # 其他字段
复制代码

  • 解决导入循环:避免在
    1. models.py
    复制代码
    中导入主程序的
    1. app
    复制代码
    对象,改用:

    1. # 在models.py中只定义模型,不初始化db
    2. db = SQLAlchemy()  # 单独创建db对象

    3. # 在app.py中关联
    4. from models import db, EmailCaptchaModel
    5. db.init_app(app)
    复制代码

    PyCharm标记源码根目录

    • 右键点击项目文件夹 → [Mark Directory as] → [Sources Root]
    • 确保
      1. models.py
      复制代码
      在蓝色标记的目录内


    迁移标准流程:

    1. # 1. 修改models.py后生成迁移脚本
    2. flask db migrate -m "add_email_captcha_table"

    3. # 2. 应用变更到数据库(关键步骤!)
    4. flask db upgrade

    5. # 3. 验证:进入数据库命令行
    6. SELECT * FROM email_captcha;  # 确认表存在
    复制代码


    注意: 若使用SQLite数据库,请检查是否使用了正确的数据库文件路径(通常为项目根目录下的 app.db)。

    以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
  • 小甲鱼最新课程 -> https://ilovefishc.com
    回复 支持 反对

    使用道具 举报

     楼主| 发表于 15 分钟前 | 显示全部楼层
    你好,导入模块已经解决。
    按你的操作ORM迁移后,数据库并没有email_captcha表。执行SELECT * FROM email_captcha命令PyCharm报错
    + SELECT * FROM email_captcha
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : InvalidArgument: (:) [Select-Object],ParameterBindingException
        + FullyQualifiedErrorId : PositionalParameterNotFound,Microsoft.PowerShell.Commands.SelectObjectCommand
    小甲鱼最新课程 -> https://ilovefishc.com
    回复 支持 反对

    使用道具 举报

    发表于 14 分钟前 | 显示全部楼层
    unupos 发表于 2025-06-19 20:19
    你好,导入模块已经解决。
    按你的操作ORM迁移后,数 ...


    您的两个问题需要分开解决:迁移未生效和SQL查询执行错误。以下是详细解决方案:

    ---

    ### 问题1:迁移成功但数据库无新表
    **原因分析:**
    1. 未正确关联数据库文件(常见于SQLite)
    2. 迁移脚本未实际执行变更
    3. 模型定义有误导致迁移脚本无效

    **解决步骤:**

    1. **确认数据库文件路径**
       在应用初始化代码中检查SQLite路径:
      

    1.    app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///app.db'  # 默认在项目根目录
    2.    
    复制代码

       使用绝对路径更可靠:
      

    1.    import os
    2.    basedir = os.path.abspath(os.path.dirname(__file__))
    3.    app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + os.path.join(basedir, 'app.db')
    4.    
    复制代码


    2. **手动验证迁移脚本**
       打开 migrations/versions 目录下最新生成的 .py 文件
       检查是否包含类似语句:
      

    1.    def upgrade():
    2.        op.create_table('email_captcha',
    3.            sa.Column('id', sa.Integer(), nullable=False),
    4.            ...
    5.        )
    6.    
    复制代码


    3. **强制重新迁移(危险操作!先备份数据)**
      

    1.    # 删除所有迁移版本
    2.    rm -rf migrations
    3.    
    4.    # 重新初始化
    5.    flask db init
    6.    flask db migrate -m "initial migration"
    7.    flask db upgrade
    8.    
    复制代码


    ---

    ### 问题2:PyCharm中SQL查询报错
    **错误原因:**
    您直接在PowerShell执行了SQL命令,这不是数据库命令行工具!

    **正确检查数据库的方法:**

    #### 方法1:使用SQLite命令行
    1. 打开PyCharm的Terminal
    2. 进入项目目录
    3. 执行:
      

    1.    sqlite3 app.db  # 进入SQLite命令行
    2.    .tables         # 查看所有表
    3.    SELECT * FROM email_captcha;  # 执行查询
    4.    .exit           # 退出
    5.    
    复制代码


    #### 方法2:使用Python验证
    创建测试文件 check_db.py

    1. from app import db, create_app
    2. from models import EmailCaptchaModel

    3. app = create_app()
    4. with app.app_context():
    5.     # 检查表是否存在
    6.     print(db.engine.table_names())  
    7.    
    8.     # 尝试查询数据
    9.     records = EmailCaptchaModel.query.all()
    10.     print(records)
    复制代码


    ---

    ### 关键排查点:
    1. 确保每次修改模型后都执行:
      

    1.    flask db migrate -m "描述"
    2.    flask db upgrade  # 这步才是真正修改数据库!
    3.    
    复制代码


    2. 检查数据库实际位置:
       在PyCharm中右键点击 app.dbOpen in Explorer 确认文件位置

    3. 验证表名大小写:
       SQLite默认区分大小写!确认模型中的 __tablename__ 和查询语句完全一致

    ---

    请按以上步骤操作后,在Terminal中执行 sqlite3 app.db 进入数据库命令行再尝试查询。

    以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
    小甲鱼最新课程 -> https://ilovefishc.com
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

    GMT+8, 2025-6-19 20:34

    Powered by Discuz! X3.4

    © 2001-2023 Discuz! Team.

    快速回复 返回顶部 返回列表