Страница 1 из 3

Нужна помощь с SQL базой данных

Добавлено: 28.09.2024,11:55
Gregorio
Здравствуйте форумчане

Возникла необходимость:
1. Сохранить изображения из таблицы в БД в файлы.
2. Уменьшить их в размере.
3. Записать их на место в базу данных.

Если говорить конкретнее, то на работе, в БД Орион Про, помещали фотографии сотрудников в очень высоком разрешении, и настал момент, когда монитор оперативной задачи перестал работать из-за раздувшейся БД, сохранять поштучно, уменьшать в размере, записывать обратно в АБД, не реально, около 7000 записей, вот и ищу способы автоматизировать этот процесс.

Нужна помощь с SQL базой данных

Добавлено: 28.09.2024,12:41
Mov AX, 0xDEAD
Gregorio писал(а): 28.09.2024,11:55 Возникла необходимость:
1. Сохранить изображения из таблицы в БД в файлы.
2. Уменьшить их в размере.
3. Записать их на место в базу данных.
Вам на freelance.ru/fl.ru надо, за денежку искать исполнителя

Нужна помощь с SQL базой данных

Добавлено: 28.09.2024,12:59
Gregorio
Mov AX, 0xDEAD писал(а): 28.09.2024,12:41 Вам на freelance.ru/fl.ru надо, за денежку искать исполнителя
Не вариант, так как работа с персональными данными.

Нужна помощь с SQL базой данных

Добавлено: 28.09.2024,14:26
pahan
В официальную техподдержку "Болида" надо идти с такой задачей, а не искать неизвестно кого. Потому что без знания структуры БД ничего конкретного тут сказать нельзя.

Орион про работает на MS SQLе, у него минимум 4 разных механизма для хранения blob (больших двоичных объектов, то есть файлов целиком). Реально скорее всего используется самый примитивный. А судя по тому что там поддерживаются древние версии (или если программист был тупой), ваши фотки там вполне могут храниться не целиком, а нарезанными на куски по n байт, которые сначала в один файл собирать придется. Если же программист был умный, он не станет хранить в БД изначально и на производительность они влияния оказать не смогут.

Вообще MS SQL очень не любит, когда БД становится по размеру больше чем оперативка. Поэтому обычно при всех проблемах с ним делается shrink БД или backup/restore. Но это если в ней изначально много свободного места. Если его нет - или добавить памяти или сначала что-то стереть, а потом уже сжимать.

Нужна помощь с SQL базой данных

Добавлено: 28.09.2024,14:47
Gregorio
pahan писал(а): 28.09.2024,14:26 В официальную техподдержку "Болида" надо идти с такой задачей, а не искать неизвестно кого. Потому что без знания структуры БД ничего конкретного тут сказать нельзя.
С техподдержкой работаю, но работа идёт очень медленно, а меня каждый день трясут.
pahan писал(а): 28.09.2024,14:26 Вообще MS SQL очень не любит, когда БД становится по размеру больше чем оперативка. Поэтому обычно при всех проблемах с ним делается shrink БД или backup/restore.
Орион 32-х разрядное приложение, работающее, в моём случае, на сервере с Windows 7 x64

Фотографии находятся в таблице dbo.pList, столбец Picture, тип данных image, фотографии находятся целиком, без разбиения.

Нужна помощь с SQL базой данных

Добавлено: 28.09.2024,15:23
esasoft
Я в этом не шарю, сразу говорю, но вопрос ChatGPT задал :-)
Вот что он выдал:
Вопрос:
В базе данных "Орион Про" помещали фотографии сотрудников в очень высоком разрешении, и настал момент, когда монитор оперативной задачи перестал работать из-за раздувшейся базы данных. Поэтому необходимо:
1. Сохранить изображения из таблицы базы данных в отдельные файлы.
2. Уменьшить их в размере.
3. Записать их на своё место в эту же базу данных.
Вручную это делать нереально - более 7000 записей, нужен способ автоматизировать этот процесс.
Применять стороннее программное обеспечение можно.

Ответ:
Для автоматизации процесса работы с изображениями в базе данных "Орион Про", можно использовать язык программирования Python, который позволяет работать с базами данных и обрабатывать изображения. Вот общий план действий:

▎Шаг 1: Извлечение изображений из базы данных

1. Установите необходимые библиотеки:

Код: Выделить всё

pip install pandas sqlalchemy pillow
2. Напишите скрипт для извлечения изображений:

Код: Выделить всё

import pandas as pd
   from sqlalchemy import create_engine

   # Создайте подключение к базе данных
   engine = create_engine('ваша_строка_подключения')

   # Загрузите данные из таблицы
   df = pd.read_sql('SELECT id, image_column FROM your_table', engine)

   # Сохраните изображения в файлы
   for index, row in df.iterrows():
       with open(f'image_{row["id"]}.jpg', 'wb') as img_file:
           img_file.write(row['image_column'])

▎Шаг 2: Уменьшение размера изображений

3. Добавьте код для уменьшения размера изображений:

Код: Выделить всё

from PIL import Image
   import os

   for index, row in df.iterrows():
       img_path = f'image_{row["id"]}.jpg'
       img = Image.open(img_path)
       img = img.resize((width, height))  # Укажите нужные размеры
       img.save(img_path)

▎Шаг 3: Запись измененных изображений обратно в базу данных

4. Запишите уменьшенные изображения обратно в базу данных:

Код: Выделить всё

   for index, row in df.iterrows():
       with open(f'image_{row["id"]}.jpg', 'rb') as img_file:
           img_data = img_file.read()
           # Обновите запись в базе данных
           with engine.connect() as connection:
               connection.execute(
                   'UPDATE your_table SET image_column = :img WHERE id = :id',
                   {'img': img_data, 'id': row['id']}
               )

▎Шаг 4: Очистка временных файлов

5. Удалите временные файлы:

Код: Выделить всё

for index, row in df.iterrows():
       os.remove(f'image_{row["id"]}.jpg')

▎Примечания:
- Замените ваша_строка_подключения, your_table, image_column, width и height на соответствующие значения.
- Убедитесь, что у вас есть резервная копия базы данных перед выполнением изменений.
- Тестируйте скрипт на небольшом объеме данных, прежде чем запускать на всех записях.

Этот подход позволит вам автоматизировать процесс извлечения, изменения и записи изображений в базу данных.

Посмотрите, может. что и выйдет путного :-)

Нужна помощь с SQL базой данных

Добавлено: 28.09.2024,15:37
pahan
Да, выглядит работоспособным.
А может и не получится читать из БД, надо преобразовывать.
Вот тут примеры экспорта/импорта на SQL и питоне:

https://quebit.com/askquebit/sql-server-image-and-varbinary-data-types/

Единственное что - pip потребуется интернет на сервере. Если это проблема, придется все эти модули вручную в зипе качать и ставить. Неудобно, но обычно возможно. Ну и кстати sqlalchemy - это что-то древнее и левое. И микрософта есть официальный клиент для python pyodbc. Да и сам тип image уже устаревшим объявлен и в следующей версии выпиливается.

Нужна помощь с SQL базой данных

Добавлено: 28.09.2024,15:57
Gregorio
Спасибо, буду пробовать

Нужна помощь с SQL базой данных

Добавлено: 28.09.2024,22:55
Gregorio
esasoft, код созданный ChatGPT не заработал, но дал мне идеи, вкупе с информацией от pahan о pyodbc.
Так что:
Gregorio писал(а): 28.09.2024,11:55 1. Сохранить изображения из таблицы в БД в файлы.
Решено.
Gregorio писал(а): 28.09.2024,11:55 2. Уменьшить их в размере.
Решено.
Gregorio писал(а): 28.09.2024,11:55 3. Записать их на место в базу данных.
В процессе, буду решать завтра, на сегодня хватит, засыпаю.

Спасибо за подсказки!

Нужна помощь с SQL базой данных

Добавлено: 29.09.2024,00:00
lexx
Оффтоп. Просто интересно кто доверил этому человеку работу с базами данных, если он не просто в них ничего не понимает, а еще и ищет информацию не на профильных сайтах а на абсолютно не соответствующем теме форуме о старых компьютерах

Нужна помощь с SQL базой данных

Добавлено: 29.09.2024,03:25
key.value
lexx, всё верно.

И эксперементы лучше проводить на восстановленной из бекапа базе не на рабочем сервере. Так что лучше сразу нанять (хотя бы на срочный договор) человека, который в таких вещах соображает и избежит колки дров.