尝试从导入的模块引用会话时,SQLAlchemy'no such table'

时间:2019-05-05 16:31:02

标签: python sqlalchemy

我有一个正在使用的应用程序,其中所有模型和会话都存储在一个models.py文件中:

import datetime
from sqlalchemy import create_engine, ForeignKey
from sqlalchemy import Column, Date, Integer, String, DateTime, Float
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.hybrid import hybrid_property, hybrid_method


engine = create_engine('sqlite:///bidbot.db', echo=True)
Base = declarative_base()
Session = sessionmaker(bind=engine)
session = Session()

class AgentLog(Base):
    __tablename__ = 'agentlog'

    id = Column(Integer, primary_key=True)
    created_at = Column(DateTime,default=datetime.datetime.utcnow)
    ingroups = Column(String)
    total_calls = Column(Integer)
    calls_waiting = Column(Integer)
    agents_logged_in = Column(Integer)
    agents_in_calls = Column(Integer)
    agents_waiting = Column(Integer)
    agents_paused = Column(Integer)
    agents_in_dispo = Column(Integer)
    agents_in_dial = Column(Integer)

    def create_new():
        session.add(AgentLog())
        session.commit()

如您所见,我有一个自定义的create_new方法,该方法使用会话创建一个新对象。

如果我自己运行这个models.py文件:

python -i models.py

然后我可以调用AgentLog.create_new()函数,它会创建一个新记录。

但是,我正在将models.py导入我的高级包中:

from models.py import *

当我在模型上运行相同的功能时:

AgentLog.create_new()

我现在收到一个没有这样的表存在的错误...这令人困惑,因为我认为该方法应该可以访问完全相同的会话对象。

sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) no such table: agentlog

1 个答案:

答案 0 :(得分:0)

想通了!当我导入软件包时,它是根据导入目录而不是models.py模块来定义具有相对路径的引擎。

我需要更新路径以基于models.py文件使用相对目录:

import os

DATABASE_DIR = os.path.dirname(os.path.abspath(__file__)) + '\\bidbot.db'
engine = create_engine('sqlite:///'+DATABASE_DIR, echo=True)