Flask -SQLAlchemy sqlalchemy.ex c .OperationalError нет такой таблицы 'comi c' - PullRequest
0 голосов
/ 17 июня 2020

У меня проблемы с flask -sqlalchemy.

У меня есть файл model.py

from app import app, db
from config import (SQLALCHEMY_DATABASE_URI, SQLALCHEMY_ECHO,
                    SQLALCHEMY_TRACK_MODIFICATION)

app.config['SQLALCHEMY_DATABASE_URI'] = SQLALCHEMY_DATABASE_URI
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = SQLALCHEMY_TRACK_MODIFICATION
app.config['SQLALCHEMY_ECHO'] = SQLALCHEMY_ECHO

class Comic(db.Model):
    __tablename__ = 'Comic'
    comicId = db.Column(db.Integer,primary_key=True)
    comicName = db.Column(db.String(100),unique=True,nullable=False)
    comicAuthor = db.Column(db.String(100),unique=False,nullable=True)
    comicPrice = db.Column(db.Numeric(20,2),unique=False,nullable=True)
    comicDescription = db.Column(db.String(500),unique=False,nullable=True)
    comicStatus = db.Column(db.String(50),unique=False,nullable=True)
    comicImage = db.Column(db.String(250),unique=False,nullable=True)

    def returnComic():
        Comic.query.all()


class User(db.Model):
    __tablename__ = 'User'
    userId = db.Column(db.Integer,primary_key=True)
    userName = db.Column(db.String(25),unique=True,nullable=False)
    passWord = db.Column(db.String(10),nullable=False)
    email = db.Column(db.String(25),unique=True,nullable=False)

class Favorite(db.Model):
    __tablename__ = 'Favorite'
    userId = db.Column(db.Integer,db.ForeignKey('user.userId'),nullable=False,primary_key=True)
    comicId = db.Column(db.Integer,db.ForeignKey('comic.comicId'),nullable=False)

Внутри моего файла app.py есть все мои маршруты

from flask import Flask, render_template
from flask_bootstrap import Bootstrap
from flask_sqlalchemy import SQLAlchemy
import model

app = Flask(__name__)
bootstrap = Bootstrap(app)
db = SQLAlchemy(app)

@app.route('/')
def index():
    results = model.Comic.returnComic()
    return render_template("index.html", results=results)

@app.route('/overview')
def overview(page=1):
    results = db.session.query(comics).all()
    return render_template("overview.html", results=results)


@app.route('/overview/details')
def details():
    return render_template("detail.html")

if __name__ == '__main__':
   db.create_all()
   app.run(debug=True)

У меня также есть конфигурация. py файл

SQLALCHEMY_DATABASE_URI= "mysql+pymysql://root:@localhost/scraper"
SQLALCHEMY_TRACK_MODIFICATION = False
SQLALCHEMY_ECHO = True

Ошибка возникает, когда я go индексирую маршрут, я хотел бы отобразить некоторые данные из базы данных внутри файла HTML, но он дает трассировку стека


sqlalchemy.exc.OperationalError

sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) no such table: Comic
[SQL: SELECT "Comic"."comicId" AS "Comic_comicId", "Comic"."comicName" AS "Comic_comicName", "Comic"."comicAuthor" AS "Comic_comicAuthor", "Comic"."comicPrice" AS "Comic_comicPrice", "Comic"."comicDescription" AS "Comic_comicDescription", "Comic"."comicStatus" AS "Comic_comicStatus", "Comic"."comicImage" AS "Comic_comicImage" 
FROM "Comic"]
(Background on this error at: http://sqlalche.me/e/e3q8)
Traceback (most recent call last)

    File "C:\laragon\www\Proftaak\.venv\Lib\site-packages\sqlalchemy\engine\base.py", line 1283, in _execute_context

    self.dialect.do_execute(

    File "C:\laragon\www\Proftaak\.venv\Lib\site-packages\sqlalchemy\engine\default.py", line 590, in do_execute

    cursor.execute(statement, parameters)

    The above exception was the direct cause of the following exception:
    File "C:\laragon\www\Proftaak\.venv\Lib\site-packages\flask\app.py", line 2464, in __call__

    return self.wsgi_app(environ, start_response)

    File "C:\laragon\www\Proftaak\.venv\Lib\site-packages\flask\app.py", line 2450, in wsgi_app

    response = self.handle_exception(e)

    File "C:\laragon\www\Proftaak\.venv\Lib\site-packages\flask\app.py", line 1867, in handle_exception

    reraise(exc_type, exc_value, tb)

    File "C:\laragon\www\Proftaak\.venv\Lib\site-packages\flask\_compat.py", line 39, in reraise

    raise value

    File "C:\laragon\www\Proftaak\.venv\Lib\site-packages\flask\app.py", line 2447, in wsgi_app

    response = self.full_dispatch_request()

    File "C:\laragon\www\Proftaak\.venv\Lib\site-packages\flask\app.py", line 1952, in full_dispatch_request

    rv = self.handle_user_exception(e)

    File "C:\laragon\www\Proftaak\.venv\Lib\site-packages\flask\app.py", line 1821, in handle_user_exception

    reraise(exc_type, exc_value, tb)

    File "C:\laragon\www\Proftaak\.venv\Lib\site-packages\flask\_compat.py", line 39, in reraise

    raise value

    File "C:\laragon\www\Proftaak\.venv\Lib\site-packages\flask\app.py", line 1950, in full_dispatch_request

    rv = self.dispatch_request()

    File "C:\laragon\www\Proftaak\.venv\Lib\site-packages\flask\app.py", line 1936, in dispatch_request

    return self.view_functions[rule.endpoint](**req.view_args)

    File "C:\laragon\www\Proftaak\app.py", line 12, in index

    results = model.Comic.returnComic()

    File "C:\laragon\www\Proftaak\model.py", line 21, in returnComic

    Comic.query.all()

    File "C:\laragon\www\Proftaak\.venv\Lib\site-packages\sqlalchemy\orm\query.py", line 3319, in all

    return list(self)

    File "C:\laragon\www\Proftaak\.venv\Lib\site-packages\sqlalchemy\orm\query.py", line 3481, in __iter__

    return self._execute_and_instances(context)

    File "C:\laragon\www\Proftaak\.venv\Lib\site-packages\sqlalchemy\orm\query.py", line 3506, in _execute_and_instances

    result = conn.execute(querycontext.statement, self._params)

    File "C:\laragon\www\Proftaak\.venv\Lib\site-packages\sqlalchemy\engine\base.py", line 1020, in execute

    return meth(self, multiparams, params)

    File "C:\laragon\www\Proftaak\.venv\Lib\site-packages\sqlalchemy\sql\elements.py", line 298, in _execute_on_connection

    return connection._execute_clauseelement(self, multiparams, params)

    File "C:\laragon\www\Proftaak\.venv\Lib\site-packages\sqlalchemy\engine\base.py", line 1133, in _execute_clauseelement

    ret = self._execute_context(

    File "C:\laragon\www\Proftaak\.venv\Lib\site-packages\sqlalchemy\engine\base.py", line 1323, in _execute_context

    self._handle_dbapi_exception(

    File "C:\laragon\www\Proftaak\.venv\Lib\site-packages\sqlalchemy\engine\base.py", line 1517, in _handle_dbapi_exception

    util.raise_(

    File "C:\laragon\www\Proftaak\.venv\Lib\site-packages\sqlalchemy\util\compat.py", line 178, in raise_

    raise exception

    File "C:\laragon\www\Proftaak\.venv\Lib\site-packages\sqlalchemy\engine\base.py", line 1283, in _execute_context

    self.dialect.do_execute(

    File "C:\laragon\www\Proftaak\.venv\Lib\site-packages\sqlalchemy\engine\default.py", line 590, in do_execute

    cursor.execute(statement, parameters)

    sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) no such table: Comic
    [SQL: SELECT "Comic"."comicId" AS "Comic_comicId", "Comic"."comicName" AS "Comic_comicName", "Comic"."comicAuthor" AS "Comic_comicAuthor", "Comic"."comicPrice" AS "Comic_comicPrice", "Comic"."comicDescription" AS "Comic_comicDescription", "Comic"."comicStatus" AS "Comic_comicStatus", "Comic"."comicImage" AS "Comic_comicImage" 
    FROM "Comic"]
    (Background on this error at: http://sqlalche.me/e/e3q8)

Теперь я немного погуглил, и, кажется, проблема заключается в том, что сначала запрашивается база данных, прежде чем модели могут быть созданы?

также предполагается переделывать базу данных всякий раз, когда я использую flask -run?

1 Ответ

1 голос
/ 17 июня 2020

Добавление ответа для записи:

Вам необходимо перенести вашу базу данных, чтобы в ней были таблицы, которые вы будете запрашивать

  1. Убедитесь, что ваш SQLALCHEMY_DATABASE_URI установлен для flask:

    export SQLALCHEMY_DATABASE_URI="mysql+pymysql://root:@localhost/scraper"
    
  2. убедитесь, что flask видит ваше приложение

    export FLASK_APP=path-to_your_app:app #might also be main or wsgi if you are using that
    
  3. Подготовьте файл миграции:

    flask db migrate -m 'starting database'
    

    Это создаст файл в миграциях / версиях, что-то вроде 4232hg44242gv24424242_starting_database.py, ccheck, что он делает то, что вы хотите (создать таблицы et c)

  4. запустите миграцию (один раз это установит alembic_version в вашей БД как 4232hg44242gv24424242 [префикс вашего файла миграции], и он будет использоваться для отслеживания того, при какой миграции ваша база данных [это означает, что вы можете обновить или перейти на более раннюю версию и иметь несколько баз данных в разных точках, и их можно легко перенести])

    flask db upgrade
    

Все готово, запустите приложение и повторите попытку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...