Поиск:

Ответ в темуСоздание новой темы Создание опроса
> хранение файлов в PostgreSQL 
:(
    Опции темы
Denis
Дата 18.8.2007, 23:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 12.7.2006

Репутация: нет
Всего: нет



PostgreSQL 8.2,  ADO,  Delphi7
Подскажите плиз или дайте ссылку, где можно прочесть про хранение файлов в постгре.
Какого типа должно быть поле в таблице, как производить чтение, запись.
PM MAIL   Вверх
Denis
Дата 19.8.2007, 17:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 12.7.2006

Репутация: нет
Всего: нет



господа, это слишком легкий и глупый вопрос или правда никто помочь не может :(
уточню вопрос нужно хранить файлы типа *.doc и *.xls. Хотелось бы, чтобы они хранились в базе а не отдельно. Подскажите тип данных в постгре для файлов.
PM MAIL   Вверх
chand0s
Дата 19.8.2007, 22:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 19.2.2007

Репутация: нет
Всего: 3



Цитата(Denis @ 19.8.2007,  15:53)
господа, это слишком легкий и глупый вопрос или правда никто помочь не может :(
уточню вопрос нужно хранить файлы типа *.doc и *.xls. Хотелось бы, чтобы они хранились в базе а не отдельно. Подскажите тип данных в постгре для файлов.

Я в Postgres'е вообще не рублю, но сильно подозреваю, что для хранения больших двоичных данных в этой СУБД  (как и в любой другой, в принципе), есть тип данных BLOB.
PM MAIL   Вверх
tux
Дата 20.8.2007, 00:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Летатель
***


Профиль
Группа: Участник Клуба
Сообщений: 1853
Регистрация: 10.2.2005
Где: msk.ru

Репутация: нет
Всего: 132



Тип называется bytea. А файлы хранить рекомендуется таки отдельно.
PM MAIL Skype GTalk Jabber YIM   Вверх
Denis
Дата 21.8.2007, 11:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 12.7.2006

Репутация: нет
Всего: нет



Сделал поле в таблице типа bytea, а вот записать инфу не получается. Перерыл DRKB, пробовал несколько способов. При попытке записи *.doc пишет ошибку "Invalid class typecast"
Подскажите, как производится чтение/запись в поля (bytea) постгре-таблицы.
PM MAIL   Вверх
SergeBS
Дата 22.8.2007, 09:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1111
Регистрация: 10.6.2005
Где: Владимир

Репутация: 11
Всего: 22



Denis
Покажи свой код.
PM MAIL   Вверх
Denis
Дата 22.8.2007, 18:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 12.7.2006

Репутация: нет
Всего: нет



Таблица 'temp' в постгре содержит единственное поле 'file' типа bytea
пробовал записать файл такими способами:

1) 
Код

(dm.ADOTable1.fieldbyname('file') as TBlobField).loadfromfile('c:1.doc');  

          Ошибка:"Invalid class typecast"

2)
Код

 dm.ADOquery1.sql.text:='Insert into temp (file) Values (:b)';
    dm.ADOQuery1.parameters.parseSQL(dm.ADOquery1.sql.text, true);
    dm.ADOQuery1.parameters.parambyname('b').LoadFromFile('c:\1.doc',ftBlob);
    dm.ADOQuery1.execsql;

           Ошибка:   "type "lo" does not exist"
3)
Код

var blob: TBlobStream;
begin
blob := dm.ADOTable1.CreateBlobStream(dm.ADOTable1.FieldByName('file'), bmWrite);

PM MAIL   Вверх
LSD
Дата 23.8.2007, 14:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15717
Регистрация: 24.3.2004
Где: Dublin

Репутация: 1
Всего: 537



Это к базе данных уже не имеет отношения.

Модератор: перемещено из Общие вопросы по базам данных.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
pythonwin
Дата 24.8.2007, 07:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2529
Регистрация: 18.4.2006
Где: за компом

Репутация: нет
Всего: 36



gрошу прощения. но думаю он пригодиться
Код
class File(SQLObject):
    data = StringCol() # 
    def _set_data(self, value):
        self._SO_set_data(value.encode('base64'))
    def _get_data(self):
        return self._SO_get_data().decode('base64')

как видно из кода, лучше хранить в TEXT - легче будет снимать дамп и поднимать его smile
PM WWW GTalk Jabber   Вверх
Denis
Дата 24.8.2007, 12:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 12.7.2006

Репутация: нет
Всего: нет



pythonwin, прошу прощения за мою неграмотность, но нельзя ли немного подробнее. Честно говоря не понял как пользоваться этим кодом
PM MAIL   Вверх
pythonwin
Дата 24.8.2007, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2529
Регистрация: 18.4.2006
Где: за компом

Репутация: нет
Всего: 36



Цитата(Denis @  24.8.2007,  15:52 Найти цитируемый пост)
pythonwin, прошу прощения за мою неграмотность, но нельзя ли немного подробнее. Честно говоря не понял как пользоваться этим кодом 

это пример на питоне
содержимое файла считывается как бинарник и перекодируется в base64 и записывается в БД
PM WWW GTalk Jabber   Вверх
SergeBS
Дата 24.8.2007, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1111
Регистрация: 10.6.2005
Где: Владимир

Репутация: 11
Всего: 22



Denis
DRKB:
Цитата

Сохранение и чтение файлов в BLOB-полях 
Код


// Сохраняем 
procedure TForm1.Button1Click(Sender: TObject);  
var  
  blob: TBlobStream;  
begin  
  blob := yourDataset.CreateBlobStream(yourDataset.FieldByName('YOUR_BLOB'), bmWrite);  
  try  
    blob.Seek(0, soFromBeginning);  
    fs := TFileStream.Create('c:\your_name.doc', fmOpenRead or  
      fmShareDenyWrite);  
    try  
      blob.CopyFrom(fs, fs.Size)  
    finally  
      fs.Free  
    end;  
  finally  
    blob.Free  
  end;  
end; 

// Загружаем 
procedure TForm1.Button1Click(Sender: TObject);  
var  
  blob: TBlobStream;  
begin  
  blob := yourDataset.CreateBlobStream(yourDataset.FieldByName('YOUR_BLOB'), bmRead);  
  try  
    blob.Seek(0, soFromBeginning);  

    with TFileStream.Create('c:\your_name.doc', fmCreate) do  
      try  
        CopyFrom(blob, blob.Size)  
      finally  
        Free  
      end;  
  finally  
    blob.Free  
  end;  
end; 


PM MAIL   Вверх
Denis
Дата 25.8.2007, 14:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 12.7.2006

Репутация: нет
Всего: нет



Я первым делом перерыл DRKB (я там только один пример не пробовал) и пробовал этот пример таким образом:
Код

var
  blob: TStream;
  fs : TFileStream;
begin
  blob := dm.ADOTable1.CreateBlobStream(dm.ADOTable1.FieldByName('file'), bmWrite);
  try
    blob.Seek(0, soFromBeginning);
    fs := TFileStream.Create('c:\1.doc', fmOpenRead or
      fmShareDenyWrite);
....

если переменную описывать как  blob: TBlobStream; ругается на несооветствие типов
Пробовал так:
Код

var
  blob: TBlobStream;
  fs : TFileStream;
begin
  blob := TBlobStream.Create(dm.ADOTable1.FieldByName('file'), bmWrite);
....

пробовал вместо ADOTable использовать ADOQuery, всё без результата
PM MAIL   Вверх
SergeBS
Дата 27.8.2007, 14:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1111
Регистрация: 10.6.2005
Где: Владимир

Репутация: 11
Всего: 22



Denis
Ну не знаю, что тебя заморочило. Вот работающий пример:
Код

{dmUsp1 - datamodule, dsDocFiles - TADODataSet -> таблица MS SQL 
CommandText = 'select * from docfiles1 where кой-какие условия для выбора именно нужного файла' 
там поле doc_value - типа Image = bytea в postgreSQL}
procedure TNamePass.GetFileFromBlob;
var
  blob1 : TStream;
begin
  with dmUsp1 do begin
    dsDocFiles1.Open;
    if dsDocFiles1.IsEmpty then
    begin
      dsDocFiles1.Close;
      MessageBox(Handle,'Не найдено обновление программы!','Проблема - записать и сообщить!',48);
      Exit;
    end;
    blob1 := dsDocFiles1.CreateBlobStream(dsDocFiles1.FieldByName('doc_value'),
      bmRead);
    try
      blob1.Seek(0, soFromBeginning);
      with TFileStream.Create(Path0 + 'komp11.exe', fmCreate) do
      try
        CopyFrom(blob1, blob1.Size);
      finally
        Free;
      end;
    finally
      blob1.Free;
      dsDocFiles1.Close;
    end;
  end;
end;

Запись - тоже по образу и подобию FAQ. Не помню - правил там типы блоба или нет. Делфи 5.
PM MAIL   Вверх
Denis
Дата 27.8.2007, 22:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 12.7.2006

Репутация: нет
Всего: нет



Ну а почему у меня не работает? Подскажите, плиз, где в этом коде ошибка?
Код

 {dm - datamodule, dsDocFiles1 - TADODataSet -> таблица MS SQL
CommandText = 'select * from temp'
там единственное поле file - типа bytea в postgreSQL}
var
  blob : TStream;
  fs : TFileStream;
begin
    blob := dm.dsDocFiles1.CreateBlobStream(dm.dsDocFiles1.FieldByName('file'), bmWrite);
  try
    blob.Seek(0, soFromBeginning);
    fs := TFileStream.Create('c:\1.doc', fmOpenRead or fmShareDenyWrite);
    try
      blob.CopyFrom(fs, fs.Size)
    finally
      fs.Free
    end;
  finally
    blob.Free
  end;

PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема »


 




[ Время генерации скрипта: 0.0909 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.