SQLAlchemy «нет такой таблицы» при попытке ссылки на сеанс из импортированного модуля - PullRequest
0 голосов
/ 05 мая 2019

У меня есть приложение, которое я использую, где все мои модели и мой сеанс хранятся в одном файле 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 голосов
/ 05 мая 2019

Разобрался! Когда я импортировал пакет, он определял движок с помощью относительного пути на основе каталога импорта, а не модуля 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...