Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

Technical Portfolio
GitHub & GitVerse Pages

Глава 2. Создание и наполнение базы данных

SQL Lab in JupyterLab

Data & BI Analyst

Abstract

В силу природной любознательности проработка этой главы будет сопровождаться исследованием функционала MyST Markdown, Jupyter Book и JupySQL.

from sqlalchemy import create_engine
from sqlalchemy.engine import URL

# Формируем структуру подключения к БД
connection_url = URL.create(
    drivername="mysql+pymysql",
    host="localhost",
    port=3306,
    database="sakila",
    username="root",
    password="********",
)
# Создаем движок подключения Engine и передаем в него готовый объект URL
engine = create_engine(connection_url)

# Активируем магические команды JupySQL в текущем ноутбуке
%load_ext sql

# Задать лимит отображения количества строк ( default=10, None осторожно)
%config SqlMagic.displaylimit = 100
# Отключить вывод строки подключения 'Running query in 'mysql+pymysql...'
%config SqlMagic.displaycon = False
# Отключить вывод количества затронутых строк `10 rows affected.`
# %config SqlMagic.feedback = False

# Передаем наш движок в JupySQL
%sql engine

# Вывод подтверждения
print("SQLAlchemy - подключение создано")
print("JupySQL - успешно подключен через SQLAlchemy Engine!")
SQLAlchemy - подключение создано
JupySQL - успешно подключен через SQLAlchemy Engine!

Создание таблицы

%%sql
CREATE TABLE person(
    person_id INT UNSIGNED,
    fname VARCHAR(20),
    lname VARCHAR(20),
    eye_color ENUM('BR', 'BL', 'GR'),
    birth_date DATE,
    street VARCHAR(30),
    city VARCHAR(20),
    state VARCHAR(20),
    country VARCHAR(20),
    postal_code VARCHAR(20),
    CONSTRAINT pk_person PRIMARY KEY (person_id)
);
Loading...
CREATE TABLE person(
    person_id INT UNSIGNED,
    fname VARCHAR(20),
    lname VARCHAR(20),
    eye_color ENUM('BR', 'BL', 'GR'),
    birth_date DATE,
    street VARCHAR(30),
    city VARCHAR(20),
    state VARCHAR(20),
    country VARCHAR(20),
    postal_code VARCHAR(20),
    CONSTRAINT pk_person PRIMARY KEY (person_id)
);
DESC person;
Loading...
Loading...
CREATE TABLE favorite_food(
    person_id INT UNSIGNED,
    food VARCHAR(20),
    CONSTRAINT pk_favorite_food PRIMARY KEY (person_id, food),
    CONSTRAINT fk_favorite_food FOREIGN KEY (person_id) REFERENCES person (person_id)
);
Loading...
DESC favorite_food;
Loading...
Loading...

Заполнение и изменение таблиц

Генерация данных числовых ключей

ALTER TABLE person MODIFY person_id INT UNSIGNED AUTO_INCREMENT;
RuntimeError: (pymysql.err.OperationalError) (1833, "Cannot change column 'person_id': used in a foreign key constraint 'fk_favorite_food' of table 'sakila.favorite_food'")
[SQL: ALTER TABLE person MODIFY person_id INT UNSIGNED AUTO_INCREMENT;]
(Background on this error at: https://sqlalche.me/e/20/e3q8)
SET FOREIGN_KEY_CHECKS = 0;
Loading...
ALTER TABLE person MODIFY person_id INT UNSIGNED AUTO_INCREMENT;
Loading...
SET FOREIGN_KEY_CHECKS = 1;
Loading...
DESC person;
Loading...
Loading...

Добавление данных

INSERT INTO person
    (person_id, fname, lname, eye_color, birth_date)
VALUES (null, 'William', 'Turner', 'BR', '1972-05-27');
Loading...
Loading...
SELECT person_id, fname, lname, eye_color, birth_date
FROM person;
Loading...
Loading...
SELECT person_id, fname, lname, eye_color, birth_date
FROM person
WHERE person_id = 1;
Loading...
Loading...
SELECT person_id, fname, lname, eye_color, birth_date
FROM person
WHERE lname = 'Turner';
Loading...
Loading...
INSERT INTO favorite_food (person_id, food)
VALUES (1, 'pizza');
Loading...
Loading...
INSERT INTO favorite_food (person_id, food)
VALUES (1, 'cookies');
Loading...
Loading...
INSERT INTO favorite_food (person_id, food)
VALUES (1, 'nachos');
Loading...
Loading...
SELECT food
FROM favorite_food
WHERE person_id = 1
ORDER BY food;
Loading...
Loading...
INSERT INTO person
    (person_id, fname, lname, eye_color, birth_date,
    street, city, state, country, postal_code)
VALUES
    (null, 'Susan', 'Smith', 'BL', '1975-11-02',
    '23 Maple St.', 'Arlington', 'VA', 'USA', '20220');
Loading...
Loading...
SELECT person_id, fname, lname, birth_date
FROM person;
Loading...
Loading...

Изменение данных

UPDATE person
SET street = '1225 Tremont St.',
    city = 'Boston',
    state = 'MA',
    country = 'USA',
    postal_code = '02138'
WHERE person_id = 1;
Loading...
Loading...
SELECT * FROM person;
Loading...
Loading...

Удаление данных

DELETE FROM person
WHERE person_id = 2;
Loading...
Loading...
SELECT * FROM person;
Loading...
Loading...

Когда хорошие инструкции становятся плохими

Не уникальный первичный ключ

INSERT INTO person
    (person_id, fname, lname, eye_color, birth_date)
VALUES (1, 'Charles', 'Fulton', 'GR', '1968-01-15');
RuntimeError: (pymysql.err.IntegrityError) (1062, "Duplicate entry '1' for key 'person.PRIMARY'")
[SQL: INSERT INTO person
    (person_id, fname, lname, eye_color, birth_date)
VALUES (1, 'Charles', 'Fulton', 'GR', '1968-01-15');]
(Background on this error at: https://sqlalche.me/e/20/gkpj)

Несуществующий внешний ключ

INSERT INTO favorite_food (person_id, food)
VALUES (999, 'lasagna');
RuntimeError: (pymysql.err.IntegrityError) (1452, 'Cannot add or update a child row: a foreign key constraint fails (`sakila`.`favorite_food`, CONSTRAINT `fk_favorite_food` FOREIGN KEY (`person_id`) REFERENCES `person` (`person_id`))')
[SQL: INSERT INTO favorite_food (person_id, food)
VALUES (999, 'lasagna');]
(Background on this error at: https://sqlalche.me/e/20/gkpj)

Нарушения значения столбцов

UPDATE person
SET eye_color = 'ZZ'
WHERE person_id = 1;
RuntimeError: (pymysql.err.DataError) (1265, "Data truncated for column 'eye_color' at row 1")
[SQL: UPDATE person
SET eye_color = 'ZZ'
WHERE person_id = 1;]
(Background on this error at: https://sqlalche.me/e/20/9h9h)

Некорректное преобразование данных

UPDATE person
SET birth_date = 'DEC-21-1980'
WHERE person_id = 1;
RuntimeError: (pymysql.err.OperationalError) (1292, "Incorrect date value: 'DEC-21-1980' for column 'birth_date' at row 1")
[SQL: UPDATE person
SET birth_date = 'DEC-21-1980'
WHERE person_id = 1;]
(Background on this error at: https://sqlalche.me/e/20/e3q8)
UPDATE person
SET birth_date = str_to_date('DEC-21-1980', '%b-%d-%Y')
WHERE person_id = 1;
Loading...
Loading...
SELECT person_id, fname, lname, birth_date
FROM person;
Loading...
Loading...

База данных Sakila

SHOW TABLES;
Loading...
Loading...
DROP TABLE favorite_food;
Loading...
DROP TABLE person;
Loading...
SHOW FULL TABLES;
Loading...
Loading...
DESC customer;
Loading...
Loading...