You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用SQLAlchemy开发应用时遭遇users表不存在错误,求排查解决

解决SQLAlchemy提示“users表不存在”的问题

你遇到的错误是由三个核心问题导致的,逐个修复即可解决:

1. 数据库引擎不统一:内存库 vs 文件库

你的models.py里创建的是内存中的SQLite数据库(sqlite:///:memory:),这种数据库仅在程序运行时存在,进程结束后就会消失;而main.py试图连接的是本地文件test_task_db.sqlite,这是两个完全独立的数据库。你在内存库里创建了表,但实际操作的文件库根本没有这些表,自然会报错。

修复方法:
统一数据库连接字符串,在models.py里改为指向文件数据库:

# models.py里修改engine定义
engine = create_engine(f'sqlite:///{DATABASE_NAME}', echo=True)

2. Users表的外键字段定义错误

Users类里的id_role字段少了Column包裹,属于语法错误,会导致表结构创建异常:
原错误代码:

id_role = (Integer, ForeignKey('roles.id'))

修复后:

id_role = Column(Integer, ForeignKey('roles.id'))

3. main.py的依赖与逻辑问题

  • 未导入models.py中的engine和必要模块(random、datetime),且name变量未定义
  • 需要确保操作数据库前,模型对应的表已经被创建(虽然models.py里有Base.metadata.create_all(engine),但要保证main.py运行时这段代码已执行)

修正后的完整代码

models.py

from sqlalchemy import create_engine, Column, Integer, VARCHAR, TEXT, DATE, ForeignKey
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import MetaData

DATABASE_NAME = 'test_task_db.sqlite'
# 改为连接文件数据库
engine = create_engine(f'sqlite:///{DATABASE_NAME}', echo=True)
Base = declarative_base()
metadata = MetaData()


class Roles(Base):
    __tablename__ = "roles"
    id = Column(Integer, primary_key=True)
    name = Column(VARCHAR(50))


class Users(Base):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True)  # SQLite对BIGINT支持有限,改用Integer更稳妥
    fio = Column(TEXT)
    datar = Column(DATE)
    # 修复外键字段定义
    id_role = Column(Integer, ForeignKey('roles.id'))


# 创建所有表
Base.metadata.create_all(engine)

main.py

import os
from datetime import datetime
from random import randint
from sqlalchemy.orm import Session
# 导入models中的engine和Users类
from models import engine, Users

BASE_DIR = os.path.dirname(os.path.abspath(__file__))
# engine已在models中配置,无需重复定义db_path
with Session(engine) as session:
    # 先给roles表添加初始数据,避免外键约束报错
    # from models import Roles
    # session.add_all([Roles(name='管理员'), Roles(name='普通用户')])
    # session.commit()
    
    # 定义name变量
    name = "张三"
    newUser = Users(
        fio=name,
        datar=datetime(2012, 3, 3, 10, 10, 10),
        id_role=randint(1, 2)
    )
    session.add(newUser)
    session.commit()

额外提醒:运行main.py前,建议先给roles表插入id为1和2的记录,否则外键约束会触发新的错误。

内容的提问来源于stack exchange,提问作者jiezzzzzzzzz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 01:45:26