Простые команды в MySQL

CREATE SCHEMA `shop` DEFAULT CHARACTER SET utf8 COLLATE utf8_bin ;
# создать БД shop с кодировкой utf8 - utf8_bin

CREATE TABLE `shop`.`category` (
  `id` INT NOT NULL,
  `name` VARCHAR(128) NOT NULL,
  `discount` TINYINT NOT NULL,
  PRIMARY KEY (`id`));
/* создать в БД shop таблицу category со столбцами id, name, discount
столбец id принять за ключ доступа к строке */

INSERT INTO `shop`.`product_type` (`name`) VALUES ('Пальто'); 
# вставить в БД shop, в таблице product_type значение для переменной
# name равное "Пальто"
INSERT INTO `shop`.`category` (`name`, `discount`) VALUES ('Обувь', 5); 
# вставить в БД shop, в таблице category значения для переменных name,
# discount равное "Обувь", 5

SELECT * FROM shop.product_type;
# отобразить таблицу product_type из БД shop

use shop;
# выбираем БД shop, 
SELECT * FROM category WHERE id = 3;
# выбираем в таблице category элемент, где id = 3
SELECT * FROM category WHERE (discount > 0) AND (discount < 10);
# выбираем в таблице category элементs, удовлетворяющие условиям
SELECT FROM category WHERE alias_name IS NOT NULL; 
# для NULL используется IS или IS NOT, для всего остального = или <>
SELECT name, discount FROM category;
# выбрать столбцы name, discount из таблицы category
SELECT DISTINCT discount FROM category;
# выдает только уникальные значения
SELECT * FROM category ORDER BY discount;
# выводим всю таблицу с сортировкой по столбцу discount
SELECT * FROM category ORDER BY discount DESC;
# сортировка в обратном порядке (DESC)
SELECT * FROM category WHERE discount <> 0 ORDER BY discount;
# комбинация команд
SELECT * FROM category LIMIT 2;
# выводит только 2 первые строки из таблицы
UPDATE category SET name = 'Головные уборы' WHERE id = 3;
# обновляем в таблице category в столбце name на "Головные уборы" там, где id = 3
UPDATE category SET discount = 3 WHERE id IN (2,3);
# обновляем в таблице category в столбце discount на "3" там, где id = 2, 3
DELETE FROM category WHERE id =3;
# удаляем из таблицы category строки, где id = 3

 

Настройка GitHub в PyCharm

  1. Заходим в File-Settings-Version Control-GitHub
  2. Кликаем Create API Token, вводим логин и пароль с GitHub’a
  3. Заходим VCS-Enable Version Control Systems. Если не всплывает ошибка, то переходим к п. 4, иначе см. примечание.
  4. Выбираем Git.
  5. Выбираем VCS-Import into Version Control-Share Project on GitHub.
  6. После этого всплывет окно, где нужно указать имя для папки, потом выбираете файлы для отправки и готово.

Но у меня возникли проблемы на этапе 3. Всплыла ошибка: Errors while executing git —version. exitCode=-1073741792 errors

После тырканий всплыла еще одна. PyCharm, что это??:

В общем если у вас что-то подобное, то нужно установить или переустановить программу Git. Скачиваем ее отсюда: https://git-scm.com/

Ставим. Везде, где был выбор, все оставил по умолчанию. И готово!

Возможно ваш PyCharm еще не тот путь видит на файл Git. Чтобы это исправить, заходим File-Settings-Version Control-Git и исправляем там путь. У меня это: C:\Program Files\Git\cmd\git.exe

======================================

Оффтоп вместо рекламы: Сарафан: поиск мастеров, если вдруг вам нужно вызвать мастера для решения бытовых вопросов

Перегрузка операторов

Перегруженный оператор — это метод со специальными именами, где за ключевым словом operator следует символ переопределяемого оператора.

class Box {
  public int Height { get; set; }
  publci int Width { get; set; }
  public Box(int h, int w) {
    Height = h;
    Width = w;
  }

public static Box operator+ (Box a, Box b) {
  int h = a.Height + b.Height;
  int w = a.Width + b.Width;
  Box res = new Box(h, w);
  return res;
  }
}
static void Main(string[] args) {
  Box b1 = new Box(14, 3);
  Box b2 = new Box(5, 7);
  Box b3 = b1 + b2;
  Console.WriteLine(b3.Height); // 19
  Console.WriteLine(b3.Width); // 10
}

Благодаря этому перегруженному оператору мы суммируем сразу 2 параметра. Перегруженный оператор должен быть static.

Перегружены могут быть все арифметические операторы и операторы сравнения. При перегрузке оператора >, оператор < должен быть тоже перегружен (тип будет bool: public static bool operator>).

Запуск сторонних приложений

Работа с путями (os, os.path), проверка существования каталога перед созданием, запуск сторонней программы с аргументами:

#Есть программа (Image Magick для Windows), которая сжимает фотографии, и есть папка «Source» 
#с самими фотографиями. Каждую фотографию мы хотим уменьшить до 200px в ширину 
#(высота меняется пропорционально). Нужно для каждой фотографии запустить программу и результат 
#работы положить в папку «Result».

#Пример (ImageMagic): convert input.jpg -resize 200 output.jpg

#Задача №3. Дополнительная (не обязательная)
#Реализовать 4 параллельных процесса и разделить фотографии между ними.

import os
import subprocess

def all_list(): # полный список файлов
    source_dir = 'Source'    
    os.chdir(os.path.join(os.path.dirname(os.path.abspath(__file__)), source_dir))
    files_list = os.listdir(path=".")
    return files_list

def ensure_dir(file_path): # проверяем есть ли уже каталог с именем Result, если нет, то создаем
    if not os.path.exists(file_path):
        os.makedirs(file_path)

def main(files_list): 
    print('Идет обработка...')
    source_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'Source')
    result_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'Result')
    ensure_dir(result_dir)
    for i in files_list:
        input_path = os.path.join(source_dir, i)
        output_path = os.path.join(result_dir, i)
        command = 'convert ' + input_path + ' -resize 200 ' + output_path
        os.chdir(os.path.dirname(os.path.abspath(__file__)))
        subprocess.run(command) #subprocess.Popen('имя') - асинхронный запуск
    print('Готово')

main(all_list())

Формирование списка файлов, содержащих запрос

Очередная тренировка работы с кодировками, поиском слов. И немного про пути к файлам (os, os.path), есть пример использования исключений (try, except).

# Задание
# мне нужно отыскать файл среди десятков других
# я знаю некоторые части этого файла (на память или из другого источника)
# я ищу только среди .sql файлов
# 1. программа ожидает строку, которую будет искать (input())
# после того, как строка введена, программа ищет её во всех файлах
# выводит список найденных файлов построчно
# выводит количество найденных файлов
# 2. снова ожидает ввод
# поиск происходит только среди найденных на этапе 1
# 3. снова ожидает ввод
# ...
# Выход из программы программировать не нужно.
# Достаточно принудительно остановить, для этого можете нажать Ctrl + C

# Пример на настоящих данных

# python3 find_procedure.py
# Введите строку: INSERT
# ... большой список файлов ...
# Всего: 301
# Введите строку: APPLICATION_SETUP
# ... большой список файлов ...
# Всего: 26
# Введите строку: A400M
# ... большой список файлов ...
# Всего: 17
# Введите строку: 0.0
# Migrations/000_PSE_Application_setup.sql
# Migrations/100_1-32_PSE_Application_setup.sql
# Всего: 2
# Введите строку: 2.0
# Migrations/000_PSE_Application_setup.sql
# Всего: 1

# не забываем организовывать собственный код в функции

import os
import chardet

migrations = 'Migrations'
current_dir = os.path.dirname(os.path.abspath(__file__))

def all_list(): 
    'Формируем полный список файлов'
    migrations_dir = os.path.join(current_dir, migrations)
    file_list = os.listdir(path=migrations_dir)
    return file_list
    
def sql_list(all_list): 
    'Функция для отбора sql-файлов'
    sql_file_list = list() # пустой список sql-файлов
    for i in all_list:
        if i.endswith('.sql'):
            sql_file_list.append(i)
    return sql_file_list

def decode_files(file_name):
    'Раскодирует файл, возвращает содержимое в читаемом виде'
    with open(os.path.join(current_dir, migrations, file_name), 'rb') as f:
        data = f.read()
        result = chardet.detect(data)
        data = data.decode(result['encoding'])
        data = data.lower()
    return data
    
def search_string(sql_list):
    'Главная функция: ищет запрашиваемую строку в файлах, список при каждом запросе сужается'
    file_list = sql_list
    while True: 
        search = input('Введите строку (регистр не важен): ') 
        search = search.lower()
        containing_files = list() # пустой список файлов для формирования сужающегося списка
        for file_name in file_list: 
            if search in decode_files(file_name):
                containing_files.append(file_name)
                print(file_name)
        print('Всего: {}'.format(len(containing_files)))
        file_list = containing_files

if __name__ == '__main__':
    search_string(sql_list(all_list()))
            
    pass

 

Классы: индексаторы

Объявление индексатора похоже на объявление свойства класса, разница лишь в том, что для индексатора нужен индекс. Как и в свойствах можно использовать элементы get и set. Однако, где свойства возвращают или устанавливают определенный элемент данных, индексаторы возвращают или устанавливают определенное значение объекта. Индексаторы определяются ключевым словом this.

class Clients {
  private sting[] names = new string[10];

  public string this[int index] {
    get {
      return names[index];
    }
    set {
      names[index] = value;
    }
  }
}

Теперь, когда мы объявили объект Clients, мы используем индекс для обращения к определенным объектам, типа элементов массива:

Clients c = new Clients();
c[0] = "David";
c[1] = "Zineddin";

Console.WriteLine(c[1]);
// Outouts "Zineddin"

Индексаторы используются, когда класс представляет собой список, коллекцию или массив объектов.