Рубрики
Без рубрики

Колбовый рецепт – RESTRY CRUD используя SQLALCHEMY

Реставральные приложения – вещь в наши дни. Когда USERBASE вашего приложения становится довольно большой, а клиент … Теги с Python, WebDev, обсуждают, SQL.

Реставральные приложения – вещь в наши дни. Когда USERBASE вашего приложения становится довольно большой, и клиент может варьироваться от ноутбука на устройство Android к устройству iOS, он платит, чтобы сохранить код бэкэнда разделить и использовать сервер только для того, чтобы сделать спокойные вызовы, используя методы HTTP, которые относятся к базовым транзакциям OLTP: Выберите, вставить, обновлять и удалять.

Популярные сторонние приложения, такие как Firebase По сути, предоставляйте вам это же – остаток на основе Front к базе данных, которая может быть доступна в Интернете, используя простые http-методы. Но в этом руководстве мы узнаем, как создать такую бэкэнд, используя Python колбу Рамки и SQLalchemy , светлый, но мощная библиотека ORM, которая может получить доступ к любой базе данных, используя его гибкий Язык выражения SQL Отказ

Вместо того, чтобы использовать FireBase, если вы разрабатываете свою собственную реализацию вашего спина, не только поможет вам узнать и стать лучшим программистом, но также дайте вам гибкое решение, которое вы можете масштабировать и изменить согласно вашим потребностям. Это также намного дешевле, чтобы провести свое собственное решение на Amazon EC2 (или Lambda) по сравнению с другими альтернативами дорогих.

Вопреки популярным мышлением, его не очень трудно создать базу данных агностической бэкэнда, такой как тот, который представлен на вышеуказанной диаграмме. С минимальными и мощными веб-структурами, такими как колбу в сочетании с силой SQLalchemy , вы можете встать и работать в течение нескольких минут. На самом деле, я разработал прототипу версии под названием Tiddly Это, по существу, делает то же самое, что и выше, используя только 172 строк кода Python. Вы можете обратиться к этому репозиторию GitHUB для справки, поскольку мы выполняем это руководство, или напрямую начинаю использовать его. Но убедитесь, что вы устанавливаете следующие зависимости перед его запуском:

pip install flask
pip install sqlalchemy

Первый шаг к созданию приложения создает модели вашей базы данных. Как только вы сделали мозговой штурм и решили, какие таблицы и поля вам понадобится, вы можете создать Models.py Исходный файл с чем-то вроде этого:

import sqlalchemy
from sqlalchemy import create_engine
from sqlalchemy import Column, String, Integer
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base

#TODO: Change as needed:
engine = create_engine("sqlite:///tiddly.db", echo=True)
Base = declarative_base()

Session = sessionmaker(bind=engine)
dbsession = Session()

class User(Base):
    __tablename__ = "user"
    id = Column(Integer, primary_key=True)
    email = Column(String)
    password = Column(String)
    name = Column(String)
    def repr(self):
        return "" % (name, email)

class Dual(Base):
    __tablename__ = "dual"
    id = Column(Integer, primary_key=True)
    text = Column(String)
    def repr(self):
        return "" % (id, text)

Я использую базу данных SQLite, например, здесь, но вы можете использовать любой на ваш выбор. А Пользователь Таблица – это довольно базовый почти в каждом приложении, так как он используется для аутентификации. Кроме того, я также создал Двойной Таблица просто играть с.

После этого создайте второй файл app.py который содержит наш код приложения. Определите следующие операторы импорта вместе с вашими моделями, поскольку они придут очень удобны:

import flask
from flask import request, jsonify, session
import sqlalchemy
from sqlalchemy import inspect, desc
import json
import models
from models import engine, dbsession

Теперь единственное, что остается сделано, это сантехника Http . Методы их соответствующих операций базы данных. Вы можете либо создать функцию отдельного представления для каждого или использовать один для всех них. В этом примере я использую одну функцию для простоты.

@app.route("/", methods=["POST", "PUT", "DELETE", "FETCH"])
def fetch(table_name):
    print("verb: %s, tablename: %s" % (request.method, table_name))
    if request.method == "POST" or request.method == "PUT":
        data = request.get_json(force=True)
        print("data:", data)
        try:
            TableClass = models.get_class_by_tablename(table_name)
            if TableClass == None: raise Exception("Table not found: %s" % table_name)
            if request.method == "POST": #insert data
                object = TableClass(**data)
                dbsession.add(object)
                dbsession.commit()
            else: #update data
                object = dbsession.query(TableClass).filter_by(**{"id":id}).first()
                if object == None: raise Exception("No data found.")
                #object.update(**data)
                for key in data.keys():
                    setattr(object, key, data[key])
                #dbsession.add(object)
                dbsession.commit()
            return jsonify({
                "status": "success",
                "id": object.id,
                })
        except Exception as e:
            return jsonify({
                "status": "error",
                "error": str(e),
                })
    elif request.method == "DELETE":
        try:
            TableClass = models.get_class_by_tablename(table_name)
            if TableClass == None: raise Exception("Table not found: %s" % table_name)
            object = dbsession.query(TableClass).filter_by(**{"id":id}).first()
            if object == None: raise Exception("No data found.")
            dbsession.delete(object)
            dbsession.commit()
            return jsonify({
                "status": "success",
                "id": object.id,
                })
        except Exception as e:
            return jsonify({
                "status": "error",
                "error": str(e),
                })
    elif request.method == "FETCH":
        try:
            data = request.get_json(force=True)
            data = json.loads(data)
            print("data: ", data)
            print("data-type: ", type(data))
            TableClass = models.get_class_by_tablename(table_name)
            if TableClass == None: raise Exception("Table not found: %s" % table_name)

            query = dbsession.query(TableClass).filter_by(**data['where'])
            if 'orderby' in data:
                for cname in data['orderby'].split(','):
                    reverse = False
                    if cname.endswith(' desc'):
                        reverse = True
                        cname = cname[:-5]
                    elif cname.endswith(' asc'):
                        cname = cname[:-4]
                    print("cname: ", cname)
                    column = getattr(TableClass, cname)
                    if reverse: column = desc(column)
                    query = query.order_by(column)
            if 'limit' in data:
                query = query.limit(data['limit'])
                query = query.offset(data['offset'])
            object = query.all()
            data = [object_as_dict(t) for t in object]
            return jsonify({
                "status": "success", 
                "data": data
                })
        except Exception as e:
            return jsonify({
                "status": "error",
                "error": str(e),
                })
    else:
        return jsonify({
            "status": "error", "error": "Unrecognized verb.",
            })

Я использовал нестандартный метод http, Извлекать для Выберите действие. Это потому, что если вы используете Получить Метод, вам не разрешено фактически публиковать данные (как в фактической публикации, не путайте с помощью Post Метод) согласно спецификации HTTP. Другие методы, вида ПОЧТА , Поставить и Удалить самоуверенно, и они стоят за ВСТАВЛЯТЬ , Обновление и Удалить действия соответственно.

Как видите, приложение хорошо использует язык выражения SQL SQLALCHEMY для динамически запроса любых видов данных, не только использующих обычные где пункт, но также используя параметры заказа и пагинации (лимита/смещения):

if 'orderby' in data:
    for cname in data['orderby'].split(','):
        reverse = False
        if cname.endswith(' desc'):
            reverse = True
            cname = cname[:-5]
        elif cname.endswith(' asc'):
            cname = cname[:-4]
        print("cname: ", cname)
        column = getattr(TableClass, cname)
        if reverse: column = desc(column)
        query = query.order_by(column)
if 'limit' in data:
    query = query.limit(data['limit'])
    query = query.offset(data['offset'])

В интернет-концерте посылается все, что ему нужно в задней части с использованием формата JSON, и результат также находится в JSON. Например, следующие JSON при размещении /Пользователь Конечная точка с использованием Извлекать Метод, возвращает запись из таблицы пользователей, где Имя полевые матчи админ и приказывает результаты по электронной почте в порядке убывания.

{"where": {"name":"admin"}, "orderby": "email desc"}

Добавление . Ограничить и Смещение Представления к тому же могут помочь передней частью пегирования.

{"where": {"name":"admin"}, "orderby": "email desc", "limit":2, "offset": 2}

Он также довольно тривиален для реализации аутентификации пользователя с этим дизайном. Я не сделал это в этом примере для простоты, но вы можете найти его в код github .

Вся код в этом руководстве и на GitHub это MIT лицензировано и свободно использовать. Итак, наслаждайтесь кодированием, постройте свое собственное приложение для спокойного Crud, и дайте мне знать, как он проходит через комментарии ниже!

( Первоначально опубликовано в моем блоге prahladyeri.com )

Оригинал: “https://dev.to/prahladyeri/flask-recipe-restful-crud-using-sqlalchemy-3731”