Интеграция Flask Migration в базу данных sqlite

Я пытаюсь интегрировать миграцию в базу данных SQLite в своем приложении Flask. я использовал

set FLASK_APP = Basic.py

в терминале Pycharm каталога проекта, затем запустите

flask db init

Но это не работает. Вот мои коды:

Basic.py

__author__ = 'User'
import os
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate,MigrateCommand


basedir = os.path.abspath(os.path.dirname(__file__))

#__file__ -->Main.py

print(basedir)

app = Flask(__name__)

app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///'+os.path.join(basedir,'data.sqlite')
app.config['SQLALCHEMY_TRACK_MODIFICATION'] = False

db = SQLAlchemy(app)

Migrate(app,db)

####################################################

class Puppy(db.Model):

    #manual table name choice
    __tablename__ = 'puppies'

    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.Text)
    age = db.Column(db.Integer)
    def __init__(self,name,age):
        self.name = name
        self.age = age
    def __repr__(self):
        return "Puppy {} is {} year/s old".format(self.name, self.age)

setupdatabase.py

__author__ = 'Mitu'
from Basic import  db,Puppy

#CREATE ALL THE TABLES Model
db.create_all()


sam = Puppy('Sammy',3)
frank = Puppy('Frankie',4)


#none
#none
print(sam.id)
print(frank.id)

db.session.add_all([sam,frank])

db.session.commit()

print(sam.id)
print(frank.id)

crud.py

__author__ = 'Mitu'
from Basic import  db,Puppy

### Create ###

my_puppy = Puppy('Rufus',5)
db.session.add(my_puppy)

db.session.commit()

#### Read ####

all_puppies = Puppy.query.all() #list of all puppies object

print(all_puppies)

# select by id

puppy_one = Puppy.query.get(1)
print(puppy_one)

# filters
# produce some sl code!
puppy_frankie = Puppy.query.filter_by(name='Frankie')
print(puppy_frankie.all())

#["Frankie is 3 years old"]


#### update

first_puppy = Puppy.query.get(1)
first_puppy.age = 10
db.session.add(first_puppy)
db.session.commit()


#### delete

second_pup = Puppy.query.get(2)
db.session.delete(second_pup)
db.session.commit()

# now all puppies

all_puppies = Puppy.query.all()
print(all_puppies)

Последние два файла предназначены для настройки базы данных и для операции CRUD базы данных sqlite.

Моя основная проблема заключается в том, что миграция не интегрируется.

Не могли бы вы заменить оба скриншота Pycharm отформатированной трассировкой ошибок, которая отображается в терминале?

arsho 07.04.2019 20:00

Я обновил эти скриншоты.

Mitu Vinci 07.04.2019 20:06

Извините, я попросил заменить скриншоты / изображения правильно отформатированным блоком кода. Вы знаете, скриншоты трудно просматривать. Вы пытаетесь загрузить существующую базу данных SQLite в свое приложение? И БД, и db.Model содержат одинаковую структуру данных?

arsho 07.04.2019 20:10

Я думаю, что и db, и db.Model содержат одинаковую структуру данных. Я обновил свой вопрос с остальными кодами файла.

Mitu Vinci 07.04.2019 20:15
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
4
1 478
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я установил необходимые пакеты в виртуальной среде, созданной с помощью Python 3.5.

virtualenv -p python3 venv --no-site-packages
source venv/bin/activate
pip install flask
pip install Flask-SQLAlchemy
pip install Flask-Migrate
pip freeze>requirements.txt

requirements.txt:

alembic==1.0.8
Click==7.0
Flask==1.0.2
Flask-Migrate==2.4.0
Flask-SQLAlchemy==2.3.2
itsdangerous==1.1.0
Jinja2==2.10.1
Mako==1.0.8
MarkupSafe==1.1.1
python-dateutil==2.8.0
python-editor==1.0.4
six==1.12.0
SQLAlchemy==1.3.2
Werkzeug==0.15.2

Поскольку flask-migrate ищет app.py при запуске flask db init, я переименовал Basic.py в app.py.

Я подключил setupdatabase.py для создания базы данных SQLite и crud.py для создания фиктивных записей.

Я создал маршрут, чтобы проверить, передаются ли эти данные SQLite в шаблон Flask.

обновлено app.py:

__author__ = 'User'


import os
from flask import Flask, render_template
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate, MigrateCommand


basedir = os.path.abspath(os.path.dirname(__file__))

app = Flask(__name__)

app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///'+os.path.join(basedir,'data.sqlite')
app.config['SQLALCHEMY_TRACK_MODIFICATION'] = False

db = SQLAlchemy(app)
migrate = Migrate(app, db)

class Puppy(db.Model):
    __tablename__ = 'puppies'

    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.Text)
    age = db.Column(db.Integer)
    def __init__(self,name,age):
        self.name = name
        self.age = age
    def __repr__(self):
        return "Puppy {} is {} year/s old".format(self.name, self.age)

@app.route('/')
def home():
    data = Puppy.query.all()
    return render_template("home.html", data = data)

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

home.html:

<html>
  <head>
    <title>Home</title>
  </head>
  <body>
    <h3>Puppies</h3>
    <div>{{ data }}</div>
  </body>
</html>

Данные передаются в шаблон:

SQLite data passed to template

Затем я выполнил команду init, migrate и upgrade, как указано в официальная документация flask-migrate.

(venv) ➜ flask db init
/home/.../flask_data_migration/venv/lib/python3.5/site-packages/flask_sqlalchemy/__init__.py:794: FSADeprecationWarning: SQLALCHEMY_TRACK_MODIFICATIONS adds significant overhead and will be disabled by default in the future.  Set it to True or False to suppress this warning.
  'SQLALCHEMY_TRACK_MODIFICATIONS adds significant overhead and '
  Creating directory
  /home/.../flask_data_migration/migrations ... done
  Creating directory
  /home/.../flask_data_migration/migrations/versions
  ... done
  Generating
  /home/.../flask_data_migration/migrations/env.py ... done
  Generating
  /home/.../flask_data_migration/migrations/README ... done
  Generating /home/.../flask_data_migration/migrations
  /script.py.mako ... done
  Generating /home/.../flask_data_migration/migrations
  /alembic.ini ... done
  Please edit configuration/connection/logging settings in '/home/.../flask_data_migration/migrations/alembic.ini' before proceeding.

(venv) ➜ flask db migrate
/home/.../flask_data_migration/venv/lib/python3.5/site-packages/flask_sqlalchemy/__init__.py:794: FSADeprecationWarning: SQLALCHEMY_TRACK_MODIFICATIONS adds significant overhead and will be disabled by default in the future.  Set it to True or False to suppress this warning.
  'SQLALCHEMY_TRACK_MODIFICATIONS adds significant overhead and '
INFO  [alembic.runtime.migration] Context impl SQLiteImpl.
INFO  [alembic.runtime.migration] Will assume non-transactional DDL.
INFO  [alembic.env] No changes in schema detected.

(venv) ➜ flask db upgrade
/home/.../flask_data_migration/venv/lib/python3.5/site-packages/flask_sqlalchemy/__init__.py:794: FSADeprecationWarning: SQLALCHEMY_TRACK_MODIFICATIONS adds significant overhead and will be disabled by default in the future.  Set it to True or False to suppress this warning.
  'SQLALCHEMY_TRACK_MODIFICATIONS adds significant overhead and '
INFO  [alembic.runtime.migration] Context impl SQLiteImpl.
INFO  [alembic.runtime.migration] Will assume non-transactional DDL.

Структура каталогов после запуска миграции (папка venv пропущена):

.
├── app.py
├── crud.py
├── data.sqlite
├── migrations
│   ├── alembic.ini
│   ├── env.py
│   ├── __pycache__
│   │   └── env.cpython-35.pyc
│   ├── README
│   ├── script.py.mako
│   └── versions
├── requirements.txt
├── setupdatabase.py
└── templates
    └── home.html

Спасибо за запуск кода. Я запутался, где мне запустить flask db init, который я пробовал в терминале pycharm, cmd и anaconda, где вы запускали эту командную строку?

Mitu Vinci 07.04.2019 21:10

Я использую терминал Ubuntu. Я создал виртуальную среду и установил все пакеты. Переименуйте Basic.py в app.py. Затем проверьте, доступны ли необходимые пакеты из терминала (Pycharm/Anaconda) с помощью команды pip freeze. Если вы видите пакеты, попробуйте flask db init, flask db migrate и flask db upgrade один за другим.

arsho 07.04.2019 21:17

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

Mitu Vinci 07.04.2019 21:38

Да, ты можешь. Я добавил в ответ команды, касающиеся виртуальной среды.

arsho 07.04.2019 21:47

Моя проблема заключалась в том, что я использовал IDE сообщества pycharm для проекта. Вот почему мне нужно создать виртуальную среду вручную. Я запускаю эту командную строку для создания виртуальной среды. python -m venv F:\mypath\for\the\project Затем я активирую эту виртуальную среду, написав эту командную строку в терминале pycharm. F:\projectPath\venv\Scripts\activate.bat включил venv . После этого мне пришлось установить все требования в терминале, который вы предложили. Затем я запускаю flask db, это сработало. :D

Mitu Vinci 09.04.2019 17:13

Другие вопросы по теме