Найти - Пользователи
Полная версия: Сохранить файл в базе данных (Python+PostgreSQL)
Начало » Базы данных » Сохранить файл в базе данных (Python+PostgreSQL)
1
babintsev
Всем привет!

У меня есть такая таблица в БД:

CREATE TABLE “Reports_MCHS”
(
“Script” bytea,
“Name” text,
“Specify_params” integer,
)
WITH (OIDS=FALSE);
ALTER TABLE “Reports_MCHS” OWNER TO postgres;

В поле “Script” хранятся текстовые файлы - скрипты на питоне.
Пишу скрипт, который добавляет файлы в эту таблицу.

import sys
import psycopg2


HOST = ‘localhost’
DB_NAME = ‘gar’
DB_USER = ‘postgres’
DB_PASS = ‘'


“”“ Открываем файл и читаем его в строковую переменную ”“”
s=open(’report_29.py','r').read()

“”“обрамляем текст в кавычки”“”
s = “'” + s + “'”

“”“ Соединяемся с сервером БД ”“”
conn = psycopg2.connect(host=HOST,database=DB_NAME,user=DB_USER,password=DB_PASS)
curs = conn.cursor()


“”“Добавляем запись в таблицу БД”“”
curs.execute(“”“INSERT INTO ”Reports_MCHS“ VALUES (%s,'NewReport',4,'word',1,7,131)”“” % s)
conn.commit()

“”“Закрываем соединение с БД”“”
curs.close()
conn.close()


Что то не получается добавить таким образом файл в БД.
Правильно ли я добавляю файл - читаю в строку и добавляю за одну операцию INSERT в таблицу??
Или надо читать файл построчно и в цикле записывать строки в базу данных??

Заранее спасибо!
slav0nic
документацию читать пробовали?
mypic = open('picture.png', 'rb').read()
curs.execute("insert into blobs (file) values (%s)",
(psycopg2.Binary(mypic),))
Ruchey
В ответе выше есть пример применения psycopg2. Как понимаю это сторонний модуль.
Как выполнить эту задачу штатными средствами?
Необходимо в базу mdb добавить картинку в поле BLOB.
4kpt_II
Хранить изображения в БД это уже хардкор… А для отображения все равно придется использовать сторонний модуль - PIL или Pillow. Если бы это извращение делал я, то поступил бы просто:
sqlalchemy + StringIO + PIL
Ruchey
Не моя затея хранить текстуры в БД. Мне надо подстраиваться.
Не понял Вашего метода.
Вот моя строка добавления данных в таблицу
  • SQL = “INSERT INTO Textures (Name, TexType, DATA) VALUES ('{}', 1, {})”.format(name, t)
    cur.execute(SQL)
Поле DATA и есть BLOB, а значение t это объект картинка.
Вот как тут правильно?
4kpt_II
Какой метод? Я написал, что родными средствами я бы это не реализовывал. sqlalchemy - это ОРМ для работы с SQL базами данных… Все это напилить легче в нем и не парить себе мозг всякими сложными SQL-запросами.
Ruchey
Для работы с БД я использую модуль pypyodbc, т.к. нет родных средств для работы с базами аксес mdb. Перерыл интернет. Не могу найти, как добавить картинку в базу mdb в поле BLOB. В чём сложность? что BLOB такой, что проблема с ним работать?
Есть поле БЛОБ, есть картинка, которую надо добавить. Вопрос в том, как? Неужели нет примера?
PooH
Ruchey
Есть поле БЛОБ, есть картинка, которую надо добавить. Вопрос в том, как? Неужели нет примера?
Блин, вот не поленился нашел машину с виндой и поставил pypyodbc, в чем вообще то проблема? Параметры надо биндить, а не в строку интерполировать.
import pypyodbc
CREATE_TABLE = '''CREATE TABLE t1 (
    id COUNTER PRIMARY KEY,
    name CHAR(25),
    datafile LONGBINARY
);'''
INSERT_IN = '''INSERT INTO t1 (name, datafile)
VALUES (?, ?);'''
#pypyodbc.win_create_mdb(r'C:\database.mdb')
connection = pypyodbc.win_connect_mdb(r'c:\database.mdb')
#connection.cursor().execute(CREATE_TABLE).commit()
with open(r'C:\test.png', 'rb') as inf:
    connection.cursor().execute(INSERT_IN, ('TEST', inf.read())).commit()
Ruchey
PooH
PooH
Спасибо за помощь, но пока у меня не выходит ничего.
Если это имеет значение, то поле с картинками создаётся так
SQL = ‘CREATE TABLE Textures (TexID AUTOINCREMENT NOT NULL PRIMARY KEY, Name VARCHAR(255), TexType INT, DATA GENERAL)’
т.е. тип поля DATA GENERAL, а Вы делаете поле типом LONGBINARY.
По Вашему примеру делал так
# Заполняем таблицу текстурами
for tex in texture:
fname = os.path.basename(tex)
name = os.path.splitext(fname)
SQL = “INSERT INTO Textures (Name, TexType) VALUES ('{}', 1)”.format(name)
cur.execute(SQL)
with open(tex, ‘rb’) as inf:
SQL = “UPDATE Textures SET DATA='{}'”.format(inf.read())
cur.execute(SQL)
но ошибка.
PooH
Ruchey
SQL = INSERT INTO Textures (Name, TexType) VALUES ('{}', 1).format(name)
Что это? Я вам такого не показывал, посмотрите наконец пример, и почувствуйте разницу между
биндингом параметров
connection.cursor().execute('INSERT INTO t1 (name, datafile) VALUES (?, ?);', ('TEST', inf.read()))
и интерполяцией строки
SQL = INSERT INTO Textures (Name, TexType) VALUES ('{}', 1).format(name)
cur.execute(SQL)
Пример полностью рабочий, раскомменте закоменченные строки и запустите
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB