使用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
相关产品推荐
相关产品推荐

