Уведомления

Группа в Telegram: @pythonsu

#1 Март 5, 2012 04:26:00

babintsev
От:
Зарегистрирован: 2012-03-05
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Сохранить файл в базе данных (Python+PostgreSQL)

Всем привет!

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

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 в таблицу??
Или надо читать файл построчно и в цикле записывать строки в базу данных??

Заранее спасибо!



Офлайн

#2 Март 5, 2012 10:42:32

slav0nic
Команда
От: dp.ua
Зарегистрирован: 2006-05-07
Сообщения: 2260
Репутация: +  41  -
Профиль   Отправить e-mail  

Сохранить файл в базе данных (Python+PostgreSQL)

документацию читать пробовали?

mypic = open('picture.png', 'rb').read()
curs.execute("insert into blobs (file) values (%s)",
(psycopg2.Binary(mypic),))

Офлайн

#3 Окт. 29, 2014 12:58:50

Ruchey
Зарегистрирован: 2014-05-26
Сообщения: 24
Репутация: +  0  -
Профиль   Отправить e-mail  

Сохранить файл в базе данных (Python+PostgreSQL)

В ответе выше есть пример применения psycopg2. Как понимаю это сторонний модуль.
Как выполнить эту задачу штатными средствами?
Необходимо в базу mdb добавить картинку в поле BLOB.

Офлайн

#4 Окт. 29, 2014 13:37:14

4kpt_II
От: Харьков
Зарегистрирован: 2013-10-24
Сообщения: 999
Репутация: +  58  -
Профиль   Отправить e-mail  

Сохранить файл в базе данных (Python+PostgreSQL)

Хранить изображения в БД это уже хардкор… А для отображения все равно придется использовать сторонний модуль - PIL или Pillow. Если бы это извращение делал я, то поступил бы просто:
sqlalchemy + StringIO + PIL

Отредактировано 4kpt_II (Окт. 29, 2014 13:42:02)

Офлайн

#5 Окт. 29, 2014 14:24:00

Ruchey
Зарегистрирован: 2014-05-26
Сообщения: 24
Репутация: +  0  -
Профиль   Отправить e-mail  

Сохранить файл в базе данных (Python+PostgreSQL)

Не моя затея хранить текстуры в БД. Мне надо подстраиваться.
Не понял Вашего метода.
Вот моя строка добавления данных в таблицу

  • SQL = “INSERT INTO Textures (Name, TexType, DATA) VALUES ('{}', 1, {})”.format(name, t)
    cur.execute(SQL)
Поле DATA и есть BLOB, а значение t это объект картинка.
Вот как тут правильно?

Офлайн

#6 Окт. 29, 2014 16:40:18

4kpt_II
От: Харьков
Зарегистрирован: 2013-10-24
Сообщения: 999
Репутация: +  58  -
Профиль   Отправить e-mail  

Сохранить файл в базе данных (Python+PostgreSQL)

Какой метод? Я написал, что родными средствами я бы это не реализовывал. sqlalchemy - это ОРМ для работы с SQL базами данных… Все это напилить легче в нем и не парить себе мозг всякими сложными SQL-запросами.

Офлайн

#7 Окт. 29, 2014 20:59:41

Ruchey
Зарегистрирован: 2014-05-26
Сообщения: 24
Репутация: +  0  -
Профиль   Отправить e-mail  

Сохранить файл в базе данных (Python+PostgreSQL)

Для работы с БД я использую модуль pypyodbc, т.к. нет родных средств для работы с базами аксес mdb. Перерыл интернет. Не могу найти, как добавить картинку в базу mdb в поле BLOB. В чём сложность? что BLOB такой, что проблема с ним работать?
Есть поле БЛОБ, есть картинка, которую надо добавить. Вопрос в том, как? Неужели нет примера?

Офлайн

#8 Окт. 30, 2014 06:17:49

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

Сохранить файл в базе данных (Python+PostgreSQL)

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()



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Офлайн

#9 Окт. 31, 2014 12:09:16

Ruchey
Зарегистрирован: 2014-05-26
Сообщения: 24
Репутация: +  0  -
Профиль   Отправить e-mail  

Сохранить файл в базе данных (Python+PostgreSQL)

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)
но ошибка.

Офлайн

#10 Окт. 31, 2014 12:55:35

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

Сохранить файл в базе данных (Python+PostgreSQL)

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)
Пример полностью рабочий, раскомменте закоменченные строки и запустите



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version