# Домашнее задание 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));**

> 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
```

> 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()
```

> 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 запросе выводится случайная фраза из нашей БД:
