我有一个正在使用的应用程序,其中所有模型和会话都存储在一个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
答案 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)