Серия плагинов Flask — Flask-SQLAlchemy

задняя часть база данных SQLite Flask

Введение

Важной частью веб-разработки является база данных. Наиболее часто в веб-программах используются реляционные базы данных, также известные как базы данных SQL. Кроме того, в последние годы в веб-разработке постепенно стали популярны базы данных документов (например, mongodb) и базы данных с парами ключ-значение (например, Redis), которые мы привыкли называть базами данных NoSQL.

Большинство механизмов реляционных баз данных (таких как MySQL, Postgres и SQLite) имеют соответствующие пакеты Python. Здесь мы не используем напрямую пакеты Python, предоставляемые этими механизмами баз данных, а используем инфраструктуру Object-Relational Mapper (ORM), которая абстрагирует инструкции по работе с базой данных низкого уровня в высокоуровневые объектно-ориентированные операции. Другими словами, если мы используем механизм базы данных напрямую, мы должны писать операторы операций SQL, но если мы используем структуру ORM, мы можем упростить работу объектов Python для сущностей базы данных, таких как таблицы и документы.

Наиболее широко используемая структура ORM в Python — этоSQLAlchemy, это очень мощная структура реляционной базы данных, которая не только поддерживает ORM высокого уровня, но также поддерживает использование низкоуровневых операций SQL, кроме того, она также поддерживает несколько механизмов баз данных, таких как MySQL, Postgres и SQLite.

Flask-SQLAlchemy

Во Flask для упрощения настройки и работы используется структура ORM:Flask-SQLAlchemy, это расширение Flask обертываетSQLAlchemyРамка. Во Flask-SQLAlchemy базы данных указываются с помощью URL-адресов.В следующей таблице перечислены распространенные механизмы баз данных и соответствующие им URL-адреса.

механизм базы данных URL
MySQL mysql://username:password@hostname/database
Postgres postgresql://username:password@hostname/database
SQLite (Unix) sqlite:////absolute/path/to/database
SQLite (Windows) sqlite:///c:/absolute/path/to/database

В приведенной выше таблице имя пользователя и пароль представляют собой имя пользователя и пароль для входа в базу данных, имя хоста представляет собой хост, на котором находится служба SQL, которая может быть локальным хостом (localhost) или удаленным сервером, а база данных представляет базу данных. быть использованным. Следует отметить, что база данных SQLite не требует сервера, она использует имя файла на жестком диске в качестве базы данных.

минимальное приложение

создать базу данных

Во-первых, мы устанавливаем Flask-SQLAlchemy с помощью pip:

$ pip install flask-sqlalchemy

Далее настраиваем простую базу данных SQLite:

$ cat app.py
# -*- coding: utf-8 -*-

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///db/users.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
db = SQLAlchemy(app)


class User(db.Model):
    """定义数据模型"""
    __tablename__ = 'users'
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True)
    email = db.Column(db.String(120), unique=True)

    def __init__(self, username, email):
        self.username = username
        self.email = email

    def __repr__(self):
        return '<User %r>' % self.username

Вот несколько вещей, на которые стоит обратить внимание:

  1. элементы конфигурации приложения приложенияSQLALCHEMY_DATABASE_URIУказывает базу данных, с которой будет работать SQLAlchemy. Здесь мы используем SQLite. URL-адрес базы данных начинается сsqlite:///начало, позжеdb/users.dbУказывает, что файлы базы данных хранятся в текущем каталогеdbв подкаталогахusers.dbдокумент. Конечно, вы также можете использовать абсолютные пути, например/tmp/users.dbЖдать.

  2. Объект db — это экземпляр класса SQLAlchemy, который представляет базу данных, используемую программой.

  3. мы определяемUserМодель должна наследоваться отdb.Model,Модель здесь фактически соответствует таблице в базе данных. Среди них переменная класса__tablename__ Определяет имя таблицы, используемой в базе данных.Если эта переменная не определена, Flask-SQLAlchemy будет использовать имя по умолчанию.

Далее мы создаем таблицу и базу данных. Для этого сначала создадим в текущем каталогеdbподкаталоги и создайте новыйusers.dbфайл, затем импортируйте объект db в интерактивную оболочку Python и вызовите метод create_all() класса SQLAlchemy:

$ mkdir db
$ python
>>> from app import db
>>> db.create_all()

Давайте проверим, что таблица «users» была успешно создана:

$ sqlite3 db/users.db    # 打开数据库文件
SQLite version 3.8.10.2 2015-05-20 18:17:19
Enter ".help" for usage hints.

sqlite> .schema users   # 查看 "user" 表的 schema
CREATE TABLE users (
        id INTEGER NOT NULL,
        username VARCHAR(80),
        email VARCHAR(120),
        PRIMARY KEY (id),
        UNIQUE (username),
        UNIQUE (email)
);

вставить данные

Теперь мы создаем некоторых пользователей, используяdb.session.add()чтобы добавить данные:

@app.route('/adduser')
def add_user():
    user1 = User('ethan', 'ethan@example.com')
    user2 = User('admin', 'admin@example.com')
    user3 = User('guest', 'guest@example.com')
    user4 = User('joe', 'joe@example.com')
    user5 = User('michael', 'michael@example.com')

    db.session.add(user1)
    db.session.add(user2)
    db.session.add(user3)
    db.session.add(user4)
    db.session.add(user5)

    db.session.commit()

    return "<p>add succssfully!"

Здесь следует отметить, что мы должны помнить о вызове в конце после добавления данных в сеанс.db.session.commit()Зафиксируйте транзакцию, чтобы данные были записаны в базу данных.

Данные запроса

Данные запроса в основном используютсяqueryинтерфейс, напримерall()метод возвращает все данные,filter_by()Метод фильтрует результаты запроса, а параметры представляют собой пары ключ-значение.filterМетод также может фильтровать результат, но параметр является логическим выражением, см. подробное введение.здесь.

>>> from app import User
>>> users = User.query.all()
>>> users
[<User u'ethan'>, <User u'admin'>, <User u'guest'>, <User u'joe'>, <User u'michael'>]
>>>
>>> user = User.query.filter_by(username='joe').first()
>>> user
<User u'joe'>
>>> user.email
u'joe@example.com'
>>>
>>> user = User.query.filter(User.username=='ethan').first()
>>> user
<User u'ethan'>

Если мы хотим увидеть необработанный оператор SQL, который SQLAlchemy генерирует для запроса, нам просто нужно преобразовать объект запроса в строку:

>>> str(User.query.filter_by(username='guest'))
'SELECT users.id AS users_id, users.username AS users_username, users.email AS users_email \nFROM users \nWHERE users.username = :username_1'

метод пагинации

Можно использовать метод пагинацииlimit()а такжеoffset()Методы, такие как запуск с третьей записи (обратите внимание, что она начинается с 0) и выборка не более 1 записи, вы можете сделать так:

users = User.query.limit(1).offset(3)

обновить данные

также обновить данныеadd()метод, если есть объект для обновления, SQLAlchemy обновляет объект, а не добавляет его.

>>> from app import db
>>> from app import User
>>>
>>> admin = User.query.filter_by(username='admin').first()
>>>
>>> admin.email = 'admin@hotmail.com'
>>> db.session.add(admin)
>>> db.session.commit()
>>>
>>> admin = User.query.filter_by(username='admin').first()
>>> admin.email
u'admin@hotmail.com'

удалить данные

Для удаления данныхdelete()метод, помнитеdeleteПосле данных, чтобы позвонитьcommit()Совершить транзакцию:

>>> from app import db
>>> from app import User
>>>
>>> admin = User.query.filter_by(username='admin').first()
>>> db.session.delete(admin)
>>> db.session.commit()

Полный код этой статьи можно найти по адресуздесьскачать.

Эта статья написанаfunhacksОпубликовано в личном блоге и выпущено под лицензией Creative Commons BY-NC-ND 4.0 (бесплатная перепечатка — сохранение авторства — некоммерческая — без вычетов).
Для некоммерческой перепечатки просьба указывать автора и источник. Для коммерческих перепечаток, пожалуйста, свяжитесь с самим автором.
Эта статья называется: Серия плагинов Flask — Flask-SQLAlchemy
Ссылка на эту статью:funhacks.net/2016/11/...

читать далее