Я использую базу данных Postgresql в своем приложении rails. Для хранения большого файла или данных в базе данных я использовал тип данных blob в MySql.
Для Postgres, какой тип данных я должен использовать вместо blob в MySql?
Спасибо!
Я использую базу данных Postgresql в своем приложении rails. Для хранения большого файла или данных в базе данных я использовал тип данных blob в MySql.
Для Postgres, какой тип данных я должен использовать вместо blob в MySql?
Спасибо!
используйте bytea (или Большие объекты, если вы абсолютно необходимо)
Я думаю, что это самый полный ответ на самой вики PostgreSQL: https://wiki.postgresql.org/wiki/BinaryFilesInDB
Прочитайте часть с заголовком "Каков наилучший способ хранения файлов в базе данных?"
Necromancing. Только для вашей информации: сохранение файлов в вашей базе данных приведет к огромному размеру базы данных. Возможно, вам это не понравится, для разработки, тестирования, резервного копирования и т.д.
Вместо этого вы должны использовать FileStream (SQL-Server) или BFILE (Oracle).
В Postgre отсутствует реализация BFILE/FileStream по умолчанию, но вы можете добавить ее: https://github.com/darold/external_file
И дополнительная информация (если вы говорите по-французски, иначе удачи с помощью google-translate) можно получить здесь:
http://blog.dalibo.com/2015/01/26/Extension_BFILE_pour_PostgreSQL.html
Чтобы ответить на вопрос:
Помимо bytea, для действительно больших файлов вы можете использовать LOBS:
// http://stackoverflow.com/info/14509747/inserting-large-object-into-postgresql-returns-53200-out-of-memory-error
// https://github.com/npgsql/Npgsql/wiki/User-Manual
public int InsertLargeObject()
{
int noid;
byte[] BinaryData = new byte[123];
// Npgsql.NpgsqlCommand cmd ;
// long lng = cmd.LastInsertedOID;
using (Npgsql.NpgsqlConnection connection = new Npgsql.NpgsqlConnection(GetConnectionString()))
{
using (Npgsql.NpgsqlTransaction transaction = connection.BeginTransaction())
{
try
{
NpgsqlTypes.LargeObjectManager manager = new NpgsqlTypes.LargeObjectManager(connection);
noid = manager.Create(NpgsqlTypes.LargeObjectManager.READWRITE);
NpgsqlTypes.LargeObject lo = manager.Open(noid, NpgsqlTypes.LargeObjectManager.READWRITE);
// lo.Write(BinaryData);
int i = 0;
do
{
int length = 1000;
if (i + length > BinaryData.Length)
length = BinaryData.Length - i;
byte[] chunk = new byte[length];
System.Array.Copy(BinaryData, i, chunk, 0, length);
lo.Write(chunk, 0, length);
i += length;
} while (i < BinaryData.Length);
lo.Close();
transaction.Commit();
} // End Try
catch
{
transaction.Rollback();
throw;
} // End Catch
return noid;
} // End Using transaction
} // End using connection
} // End Function InsertLargeObject
public System.Drawing.Image GetLargeDrawing(int idOfOID)
{
System.Drawing.Image img;
using (Npgsql.NpgsqlConnection connection = new Npgsql.NpgsqlConnection(GetConnectionString()))
{
lock (connection)
{
if (connection.State != System.Data.ConnectionState.Open)
connection.Open();
using (Npgsql.NpgsqlTransaction trans = connection.BeginTransaction())
{
NpgsqlTypes.LargeObjectManager lbm = new NpgsqlTypes.LargeObjectManager(connection);
NpgsqlTypes.LargeObject lo = lbm.Open(takeOID(idOfOID), NpgsqlTypes.LargeObjectManager.READWRITE); //take picture oid from metod takeOID
byte[] buffer = new byte[32768];
using (System.IO.MemoryStream ms = new System.IO.MemoryStream())
{
int read;
while ((read = lo.Read(buffer, 0, buffer.Length)) > 0)
{
ms.Write(buffer, 0, read);
} // Whend
img = System.Drawing.Image.FromStream(ms);
} // End Using ms
lo.Close();
trans.Commit();
if (connection.State != System.Data.ConnectionState.Closed)
connection.Close();
} // End Using trans
} // End lock connection
} // End Using connection
return img;
} // End Function GetLargeDrawing
public void DeleteLargeObject(int noid)
{
using (Npgsql.NpgsqlConnection connection = new Npgsql.NpgsqlConnection(GetConnectionString()))
{
if (connection.State != System.Data.ConnectionState.Open)
connection.Open();
using (Npgsql.NpgsqlTransaction trans = connection.BeginTransaction())
{
NpgsqlTypes.LargeObjectManager lbm = new NpgsqlTypes.LargeObjectManager(connection);
lbm.Delete(noid);
trans.Commit();
if (connection.State != System.Data.ConnectionState.Closed)
connection.Close();
} // End Using trans
} // End Using connection
} // End Sub DeleteLargeObject