[PyQT5+PostgreSQL] Как добавить невидимый символ и с помощью него разделить товары на фильтры?

loneres

Новичок
Пользователь
Ноя 21, 2021
7
0
1
Здравствуйте, нужна помощь в Python+PostgreSQL.
У меня есть приложение python с графическим интерфейсом PyQT5.
Есть база данных на PostgreSQL 12.

В базе данных есть товары, точнее их названия, и в этих названиях так же находится другая информация, то-есть (Вид, метры, фильтр и т.д)
Мне нужно вытащить эту информацию из всех товаров , чтоб я мог ее подключить к фильтрам и т.д чтоб можно было фильтровать товары по этим данным. (Поиск)
Подскажите как лучше всего это сделать?

Вот пример как нужно разделить товары:

1)Арматура ГЛАДКАЯ А1/катанка/круг ф10 2й сорт (11,7м)
1:ГЛАДКАЯ
2:А1/катанка/круг
3:ф10
4:2й сорт
5:(11,7м)
2)Арматура композитная (бухта 50м.п.) АКС -6/АСП-6
1:композитная
2:бухта 50м.п.
3:АКС -6/АСП-6
3)Балка двутавровая - вес 1 м.п. 10
1:двутавровая
2:вес 1 м.п.
3:10
4)балка двутавровая колонная 20Ш1 3сп-5
1:двутавровая колонная
2:20Ш1
3:3сп-5

Нужно вот так вытащить эту информацию от туда. Как видно у всех товаров разная длина. И нужно чтоб автоматически он вытаскивал эту инфу со всех товаров. В ручную это слишком долго и не получится.

Мне говорили что можно во всех товарах автоматически расставить разделитель который будет служить разделению названий. Тоесть использовать невидимый символ и с помощью него поделить товары все как нужно. Но как автоматически поставить там где нужно во всех товарах этот невидимый разделить я так и не смог и прогнать все товары для разделения.

Я смог первые 14 товаров которые по длине одинаковые сделать через substring и split_part. Но я не могу так разделить все товары правильно ведь длина разная у всех.

Вот код через который я смог разделить первые 14 товаров:
Python:
def data_item(self):
        connecting = psycopg2.connect(dbname='client_mbox_', user='su_mbox_user', host='195.93.152.122',
                                      password='VN0st1m#base#vft', port=5432)
        cursor = connecting.cursor()
        
        # list
        cursor.execute(f'SELECT item FROM list')
        # list view
        items = cursor.fetchall()
        #print(items)
        # TESTING ARMATURA
        # formating list (NAME)
        cursor.execute(f'SELECT SUBSTRING(item, 0, 9) FROM list;')
        item_name = cursor.fetchall()
        for number, text in enumerate(item_name):
            if number == 14:
                break
            else:
                print(text)
        # formating list (VALUE)
        cursor.execute(f'SELECT SUBSTRING(item, 10, 8) FROM list;')
        item_value = cursor.fetchall()
        for number, text in enumerate(item_value):
            if number == 14:
                break
            else:
                print(text)
        # formating list (BOX)
        cursor.execute(f'SELECT SUBSTRING(item, 18, 18) FROM list;')
        item_box = cursor.fetchall()
        for number, text in enumerate(item_box):
            if number == 14:
                break
            else:
                print(text)
        # formating list (FORMAT)
        cursor.execute(f'SELECT SUBSTRING(item, 34, 38) FROM list;')
        item_format = cursor.fetchall()
        for number, text in enumerate(item_format):
            if number == 14:
                break
            else:
                print(text)

Но это сделано через substring и того эффекта который мне нужен нету.

Вот код для подключения к базе данных:
Python:
connecting = psycopg2.connect(dbname='client_mbox_', user='su_mbox_user', host='195.93.152.122',
                                      password='VN0st1m#base#vft', port=5432)
        cursor = connecting.cursor()

Подскажите как можно изменить код чтобы добиться того что мне нужно для всех товаров или как добавить автоматически во все товары невидимый разделить и с помощью него разделить все товары так.

На прикрепленных скринах:
База данных (список товаров)
Работа substring и split_part
Отработка кода выше python
 

Вложения

  • Screenshot_1.jpg
    Screenshot_1.jpg
    400,2 КБ · Просмотры: 3
  • Screenshot_2.jpg
    Screenshot_2.jpg
    504,1 КБ · Просмотры: 3
  • Screenshot_3.jpg
    Screenshot_3.jpg
    137,8 КБ · Просмотры: 2
  • Screenshot_4.jpg
    Screenshot_4.jpg
    125,2 КБ · Просмотры: 3

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 650
472
83
по хорошему конечно, для каждого свойства нужно свое поле в базе, но вы можете добавить разделитель
например так, тут разделитель у нас восклицательный знак (!), в переменной s1 как бы позиция из базы
Python:
s1 = "Арматура! ГЛАДКАЯ! А1/катанка/круг! ф10! 2й сорт! (11,7м)"

lst_s1 = s1.split("!")
print(f"1){''.join(lst_s1).replace('!', '')}")
count = 1
for i in lst_s1:
    print(f"{count}:{lst_s1[count]}")
    count += 1
    if count == len(lst_s1):
        break

естественно, подразумевается, что в таблице у вас записана строка уже с разделителями (!), то есть так
Арматура! ГЛАДКАЯ! А1/катанка/круг! ф10! 2й сорт! (11,7м)
 
Последнее редактирование:

loneres

Новичок
Пользователь
Ноя 21, 2021
7
0
1
по хорошему конечно, для каждого свойства нужно свое поле в базе, но вы можете добавить разделитель
например так, тут разделитель у нас восклицательный знак (!), в переменной s1 как бы позиция из базы
Python:
s1 = "Арматура! ГЛАДКАЯ! А1/катанка/круг! ф10! 2й сорт! (11,7м)"

lst_s1 = s1.split("!")
print(f"1){''.join(lst_s1).replace('!', '')}")
count = 1
for i in lst_s1:
    print(f"{count}:{lst_s1[count]}")
    count += 1
    if count == len(lst_s1):
        break

естественно, подразумевается, что в таблице у вас записана строка уже с разделителями (!), то есть так
Арматура! ГЛАДКАЯ! А1/катанка/круг! ф10! 2й сорт! (11,7м)
Здравствуйте, действительно то что нужно.

Но можно вопрос?
Как можно все позиции в базе данных отформатировать через python или sql чтоб добавить туда знак !
 

loneres

Новичок
Пользователь
Ноя 21, 2021
7
0
1
Тоесть я смогу так вытащить данные, а как мне потом нужно будет редактировать эти данные так чтобы потом по ним фильтровать.

Тоесть если ввести арматура то там выпадет список ф10 ф1 ф3 и если нажать ф3 то должен выйти арматура ф3
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 650
472
83
Как можно все позиции в базе данных отформатировать через python или sql чтоб добавить туда знак !
можно сделать шаблон, у вас у каждой категории товара по сути название одинаковое в плане построения, можно сделать шаблон и по нему подставлять, только придется для каждой категории его переделывать...
у вас с самого начала архитектура базы не верна, нужно отдельные поля для свойств, внешние ключи для контроля целостности, вы вот застряли на простой выборке, если выборка посложнее или фильтрацию сделать, то уже все - будет костыль на костыле...

Тоесть если ввести арматура то там выпадет список ф10 ф1 ф3 и если нажать ф3 то должен выйти арматура ф3
если я правильно понял вопрос, вам нужно поиск в базе сделать...
есть оператор MATCH - это полнотекстовый поиск в базе
еще есть оператор LIKE - он сопоставляет искомое выражение с шаблоном поиска
 

Форум IT Специалистов