Использование моделей колб-sqlalchemy с проектом non-flask [duplicate]

Как и ответ Каспара, но с флагом g, чтобы заменить все вхождения на строку.

find ./ -type f -exec sed -i 's/string1/string2/g' {} \;

Для глобальной нечувствительности к регистру:

find ./ -type f -exec sed -i 's/string1/string2/gI' {} \;
18
задан Erik Oosterwaal 14 October 2015 в 14:53
поделиться

4 ответа

Расширение Flask-SQLAlchemy, как и большинство расширений Flask, должно создаваться за пределами фабрики, а затем инициализироваться на заводе-изготовителе с помощью init_app. Это значит, что вы можете использовать объект db до создания приложения.

db = SQLAlchemy()

def create_app():
    app = Flask(__name__)
    db.init_app(app)
    return app

Приложение Flask, как и любой правильно разработанный проект Python, должно быть устанавливаемым пакетом. Это просто сделать: убедитесь, что ваш макет проекта имеет смысл, затем добавьте основной файл setup.py.

project/
    my_flask_package/
        __init__.py  # at the most basic, this contains create_app and db
    setup.py
from setuptools import setup, find_packages

setup(
    name='my_flask_package',
    version='1.0',
    packages=find_packages(),
    install_requires=['flask', 'flask-sqlalchemy'],
)
$ python setup.py sdist

Теперь вы можете установить приложение Flask, а также его базы данных, для использования в других проектах. Установите и импортируйте его во виртуальный файл второго проекта, затем создайте и нажмите приложение для его инициализации.

$ pip install my_flask_package-1.0.tar.gz
from my_flask_package import db, create_app
create_app().app_context().push()
db.session.query(...)

Если вы обеспокоены накладными расходами на создание своего приложения, вы можете добавить аргументы к функции create_app для управления тем, что инициализируется. В большинстве случаев это не должно быть проблемой.

17
ответ дан davidism 21 August 2018 в 03:29
поделиться

Вы можете легко поделиться. Я покажу, как. Учитывая это приложение Flask:

.
├── config.py
├── db
│   └── test.db
├── do_somenthing2.py ============> Here is run some script 2
├── do_something.py   ============> Here is run some script
├── machinelearning
│   ├── models
│   │   ├── restore.py
│   │   ├── train.py
│   │   └── utils.py
│   └── save
│       └── test.ckpt
├── runserver.py ============> Here is run your app
├── test.py
└── web
    ├── __init__.py
    ├── api
    │   ├── __init__.py
    │   ├── app.py  ============> Here is app = Flask(__name__)
    │   ├── client.py
    │   ├── models.py ==========> Here is db = SQLAlchemy(app)
    │   ├── sample.json
    │   └── utils.py
    └── frontend
        ├── __init__.py
        └── routes.py

runningerver.py

import os

from config import DEBUG

from web.api.app import app
from web.api.client import *

if __name__ == "__main__":
    app.run(debug=DEBUG)

OK. Теперь вы хотите использовать одни и те же модели для выполнения другой задачи. Например: обучить машину, обслуживать и сохранять в базе данных (ORM), используя те же модели.

Вы можете импортировать приложение и использовать app.test_request_context (). Например:

do_something.py

из web.api.app импортировать приложение из web.api.models import db, user

def do_something():
    q = db.session.query(User)\
        .filter(User.Name.ilike('Andre'))
    for i in q.all():
        print (i.Name)    

with app.test_request_context():
    do_something()

do_something2. py (реальный пример)

from web.api.app import app
from web.api.models import *

def save(df):

    passengers = []

    records = df.to_dict('records')

    for row in records:
        p = Passenger(row)
        passengers.append(p)

    for p in passengers:
        db.session.add(p)

    db.session.commit()

from ml.models import train, restore

with app.test_request_context():
    print ('Trainning model. It will take a while... (~ 5 minutos)')
    train.run()
    print ('Saving model...')
    save(restore.run())
    print ('Saved!')

Многие ответы рекомендуют использовать (импортировать файлы из другой папки):

import sys
sys.path.append('../')

Но я не согласен, когда у вас есть приложение Flask и другие скрипты, потому что вы получите сумасшедшее решение относительных ссылок.

Другим вариантом является подход к установке вашего приложения Flask вместе с его базой данных для использования в других проектах.

Здесь вы можете найти документацию о пакетах и ​​модулях .

Пакеты - это способ структурирования пространства имен модулей Python с использованием имен «пунктирных модулей». Например, имя модуля AB обозначает подмодуль с именем B в пакете с именем A. Так же, как использование модулей позволяет авторам разных модулей не беспокоиться об именах глобальных переменных друг друга, использование имен точек в пунктах сохраняет авторов из многомодульных пакетов, таких как NumPy или Pillow, из-за необходимости беспокоиться о именах модулей друг друга.

0
ответ дан Andre Araujo 21 August 2018 в 03:29
поделиться
  • 1
    Спасибо Андре, за подробное объяснение. Я знаю, что я могу использовать app.test_request_context () или просто app.app_context (), но это просто запустит контекст Flask. Я хотел знать, возможно ли это без колба. Мы используем app.app_context () для этого, так как @davidism, предложенный выше. – Erik Oosterwaal 21 May 2018 в 10:07
  • 2
    Я действительно пробовал по-другому, но пока не нашел. Решение, которое @davidism дал как ответ (установка приложения Flask), является еще одним вариантом. – Andre Araujo 21 May 2018 в 21:37

Для других людей, занимающихся этим направлением. Существует неплохая запись в блоге и ссылка на библиотеку , которая предлагает Flask-SQLAlchemy как преимущества, без прямого связывания SQLAlchemy с Flask.

Однако слово предупреждения; Я пытался использовать Alchy, но все еще не мог понять, как интегрировать его в Flask и не-web-приложение, поэтому я пошел с принятым ответом давидизма на этот вопрос. Ваш пробег может отличаться.

2
ответ дан Erik Oosterwaal 21 August 2018 в 03:29
поделиться
  • 1
    @dgilland может предоставить ответ на интеграцию Alchy с Flask и не-веб-приложением – Jeff Widman 18 March 2016 в 08:10

Я столкнулся с той же проблемой.

Если вы включите «SQLALCHEMY_ECHO», вы, вероятно, увидите, что новая транзакция запущена, но отсутствует соответствующий COMMIT / ROLLBACK.

Для того, что я узнал, это имеет какое-то отношение к двум экземплярам SQLAlchemy, которые вы также создаете, один раз в вашем файле модели и один раз на вашем веб-сайте. Скорее всего, это связано с тем, что вы взаимодействуете со своим сеансом web.py, и если вы запрашиваете свои модели, есть какой-то контекст, который будет получать COMMIT.

Я исправил проблему, импортировав «db» из моделей, а затем init это, вызвав db.init_app (приложение). Согласно журналам, фиксация теперь отлично работает.

@app.teardown_appcontext не требуется, поскольку он настроен в классе SQLAlchemy Flask-SQLAlchemy ( https://github.com/mitsuhiko /flask-sqlalchemy/blob/master/flask_sqlalchemy/init.py)

1
ответ дан Iron Fist 21 August 2018 в 03:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: