# Домашнее задание 19 Базы данных ссылка на ответ: [https://hackmd.io/@UoML1WbiS8-spZjQFgS6QQ/BJ3WhhiuY](https://hackmd.io/@UoML1WbiS8-spZjQFgS6QQ/BJ3WhhiuY) > 1) Чем отличается принцип ACID от BASE? **Принцип ACID** *Atomicity* — атомарность транзакций. Некоторые операции должны быть объединены в неделимую транзакцию. *Consistency* — согласованность. Иначе могут возникнуть битые ссылки. *Isolation* — изолированность параллельной обработки транзакций. *Durability* — надежность записи данных на носитель внешней памяти. Традиционные RDBMS = принцип ACID **принцип BASE**: *Basically Available*, базовая доступность (сбой в некоторых узлах приводит к отказу в обслуживании только для незначительной части сессий при сохранении доступности в большинстве случаев) *Soft-state*, неустойчивое состояние (возможность жертвовать долговременным хранением состояния сессий (таких как промежуточные результаты выборок, информация о навигации, контексте), при этом концентрируясь на фиксации обновлений только критичных операций) *Eventually consistent*, согласованность в конечном счёте (возможность противоречивости данных в некоторых случаях, но при обеспечении согласования в практически обозримое время) СУБД на принципе BASE нужны, если: -структура данных нерегулярна -нужна высокая масштабируемость -нужна высокая доступность -допустима немгновенная согласованность данных -не требуется атомарность операций > 2) Создайте таблицу address в соответствии со схемой - id - serial, address - строка 200 символов > **CREATE TABLE address (id serial PRIMARY KEY, address varchar(200));** ![](https://i.imgur.com/Dq6NaYX.jpg) > 3) Создайте sh скрипт, который генерирует данные для таблицы users. Заполните таблицу скриптом ``` #!/bin/bash for AGE in {20..40}; do export NAME=$(names); echo "INSERT INTO users (name, address, age) VALUES ('$NAME', 0, $AGE);"; done > user.sql psql -d addressbook < user.sql ``` ![](https://i.imgur.com/E0KJHxB.jpg) > 4) необязательное - заполните таблицу users c помощью Python ``` #!/usr/bin/env python3 import psycopg2 import names import random conn = psycopg2.connect(user='teetotaller', password='', dbname='addressbook') cur = conn.cursor() for id in range(10000): if (id % 100 == 0): print(id) cur.execute( "INSERT INTO users(name, address, age) VALUES (%s, 0, %s)", (names.get_full_name(), random.randrange(20,40)) ) conn.commit() ``` ![](https://i.imgur.com/4FqiALG.jpg) > 5) необязательное - добавьте функционал в ваше Flask приложение, чтобы оно подключалось к базе данных, например, при отрисовке главной страницы внизу выводилась цитата дня (данные можно взять отсюда ​​https://gist.github.com/JakubPetriska/060958fd744ca34f099e947cd080b540#file-quotes-csv, потом сконвертировать их в sql так же как имена и возраст в лекции) Загоняем данные из ссылки в созданную таблицу в нашей БД с помощью Python: ``` #!/usr/bin/env python3 import requests import psycopg2 from contextlib import closing import csv conn = psycopg2.connect(user='teetotaller', password='', dbname='phrases') cur = conn.cursor() url = 'https://gist.githubusercontent.com/JakubPetriska/060958fd744ca34f099e947cd080b540/raw/963b5a9355f0$ with requests.Session() as s: download = s.get(url) decoded_content = download.content.decode('utf-8') cr = csv.reader(decoded_content.splitlines(), delimiter=',') my_list = list(cr) for row in my_list: cur.execute( "INSERT INTO phtable(author, phrase) VALUES (%s, %s)", (row[0], row[1]) ) conn.commit() ``` Создаем и запускаем Flask приложение: ``` from flask import Flask, request, Response, redirect, url_for, render_template import psycopg2 import random conn = psycopg2.connect(user='teetotaller', dbname='phrases') cur = conn.cursor() cur.execute("SELECT count(id) FROM phtable;") lim = cur.fetchone()[0] app = Flask(__name__) @app.route("/", methods=["GET"]) def index(): cur.execute("SELECT * FROM phtable where id = " + str(random.randrange(0,lim)) + ";") return "<p>"+cur.fetchone()[2]+"</p>" if __name__ == "__main__": app.run() ``` Результат проверяем через браузер, при каждом GET запросе выводится случайная фраза из нашей БД: ![](https://i.imgur.com/R2ciN5t.jpg)