<SYSTEM_TASK:>
Given the following text description, write Python code to implement the functionality described below step by step
<END_TASK>
<USER_TASK:>
Description:
 Задание 1
Написать функцию на языке Python, формирующую список всех исполнителей композиций жанра Рок. Список должен быть упорядочен в порядке убывания.
Step1:  Задание 2
Написать функцию на языке Python, создающую таблицу Студентов Students(id, name, gpa). Ключ - id.
Step2:  Проверим, что таблица создана
Step3:  Задание 3
Для созданной выше функции реализовть возможность добавления списка студентов вида [['Ivanov', 1.2], ['Petrov', 2.3]].
ID новых студентов должно начинаться с максимального ID в таблице + 1. (Например, если в таблице максимальный ID - 10, то у Петрова должно быть - 11, у Иванова - 12). Функция должна предполагать вставки списка любой ограниченной длины.
Получаем max(id) + 1
Step4:  Задание 4
Добавить таблицу Факультетов Faculties(fac_id, name). Для таблицы Students добавить новое поле fac_id с внещним ключом на таблицу факультетов.
Step5:  Задание 5
Написать функцию, осуществляющую обновления всех факультетов у каждого студента. Функция должна выводить информацию о студенту, приглашение на вход для обновления факультета и обновление факультета. При возникновение вставки функция должна обрабатывать исключение, и продолжать работу.
Для начала добавим в таблицу факультетов пару записей
Step6:  Задание 6
Написать функцию, осущетсвляющую перевод части учеников на новый факультет. На входе
<ASSISTANT_TASK:>
Python Code:
def task1():
    cursor = db.cursor()
    cursor.execute('''
    select distinct ar.Name
from tracks t 
  inner join albums al
    on t.albumid = al.albumid
  inner join artists ar
    on al.artistid = ar.artistid
  inner join genres g
    on t.genreid = g.genreid 
where g.name = 'Rock'
    ''')
    ar = cursor.fetchall()
    return [x[0] for x in  ar]
    
    
task1()
Explanation: Задание 1
Написать функцию на языке Python, формирующую список всех исполнителей композиций жанра Рок. Список должен быть упорядочен в порядке убывания.
End of explanation
def task2():
    cursor=db.cursor()
    cursor.execute('''
    DROP TABLE IF EXISTS students''')
    cursor.execute('''
    CREATE TABLE Students(id INTEGERE PRIMARY KEY, name TEXT, gpa NUMBER(10,2))''')
    db.commit()
task2()
Explanation: Задание 2
Написать функцию на языке Python, создающую таблицу Студентов Students(id, name, gpa). Ключ - id.
End of explanation
%%sql
select * 
from students
Explanation: Проверим, что таблица создана
End of explanation
%%sql
select coalesce(max(id)+1, 1) as new_id from students
def task3(l_students):
    cursor = db.cursor()
    cursor.execute( '''
    SELECT COALESCE(MAX(ID)+1, 1) AS new_id FROM students''')
    new_id = cursor.fetchone()[0]
    for i, student in enumerate(l_students):
        cursor.execute('''
        INSERT INTO Students(id, name, gpa) VALUES(?,?,?)''', (new_id + i, student[0], student[1]))
        
    db.commit()
    
    
task3([['Ivanov', 3.2], ['Petrov', 4.2]])
%%sql
SELECT * 
FROM Students
Explanation: Задание 3
Для созданной выше функции реализовть возможность добавления списка студентов вида [['Ivanov', 1.2], ['Petrov', 2.3]].
ID новых студентов должно начинаться с максимального ID в таблице + 1. (Например, если в таблице максимальный ID - 10, то у Петрова должно быть - 11, у Иванова - 12). Функция должна предполагать вставки списка любой ограниченной длины.
Получаем max(id) + 1
End of explanation
def task4():
    cursor = db.cursor()
    cursor.execute('''DROP TABLE IF EXISTS faculties''')
    cursor.execute('''CREATE TABLE faculties(fac_id INTEGER PRIMARY KEY, name TEXT)''')
    cursor.execute('''ALTER TABLE students ADD fac_id INTEGER REFERENCES faculties(fac_id)''')
    db.commit()
task4()
%%sql 
select * 
from faculties
%%sql 
select * 
from Students
Explanation: Задание 4
Добавить таблицу Факультетов Faculties(fac_id, name). Для таблицы Students добавить новое поле fac_id с внещним ключом на таблицу факультетов.
End of explanation
%%sql
INSERT INTO faculties(fac_id, name)
VALUES (1, 'IT'), (2, 'KIB'), (3, 'Math')
%%sql 
select * 
from faculties
a = input('1 {}', '2')
def task5():
    cursor = db.cursor()
    cursor.execute('Select id, name, gpa from Students')
    a = cursor.fetchall()
    for x in a:
        print("Введите факультет для студента {} с id = {} и gpa = {}".format(x[1], x[0], x[2]))
        fac_name = input()
        cursor.execute("SELECT fac_id from faculties where name = ?", (fac_name, ))
        # Проверяем есть ли такая запись
        try:
            fac_id = cursor.fetchone()[0]
        except TypeError:
            continue
        cursor.execute("Update students set fac_id = ? where id = ?", (fac_id, x[0],))
    db.commit()
        
task5()
%%sql 
SELECT * 
FROM students
task5()
%%sql 
SELECT * 
FROM Students
Explanation: Задание 5
Написать функцию, осуществляющую обновления всех факультетов у каждого студента. Функция должна выводить информацию о студенту, приглашение на вход для обновления факультета и обновление факультета. При возникновение вставки функция должна обрабатывать исключение, и продолжать работу.
Для начала добавим в таблицу факультетов пару записей
End of explanation
def task6(fac_name, l_id):
    cursor = db.cursor()
    cursor.execute( '''
    SELECT COALESCE(MAX(fac_id)+1, 1) AS new_fac_id FROM faculties''')
    new_id = cursor.fetchone()[0]
    cursor.execute('''
    INSERT INTO faculties(fac_id, name) VALUES(?,?)''', (new_id, fac_name,))
    for x in l_id:
        cursor.execute('''
        Update students set fac_id = ? where id = ?''', (new_id, x, ))
    
    db.commit()
task6('Hist', [1])
%%sql 
select * 
from students
Explanation: Задание 6
Написать функцию, осущетсвляющую перевод части учеников на новый факультет. На входе: Имя факультета, Список студентов для перехода на новый факультет. На выходе Добавление новой записи в таблицу факультетов, Обновление записей в таблице студентов.
End of explanation
<END_TASK>