iT邦幫忙

0

python 如何將圖片轉成二進制存到資料庫

ddx 2022-04-15 10:33:352713 瀏覽
  • 分享至 

  • xImage

這是我的語法

d = db(2)
with open('2.jpg','rb') as f:
    r = f.read()
    
sql = "INSERT INTO Fty_Photo(img2) values('%s')" % (r)
d.run_cmd(sql)

儲存的時候他會報很長的錯誤
ProgrammingError: (102, b"Incorrect syntax near '\'.DB-Lib error message 20018, severity 15:\nGeneral SQL Server error: Check messages from the SQL .......以下省略

網上找基本上都是存到MYSQL裡面去,但是資料型態是BLOB或LONGBLOB
MSSQL好像沒有這兩種型態
我設定了資料型態有兩個一個是image另一個則是varbinary(MAX)
有人知道這其中一種的儲存方式嗎?
我想用PY存入到資料庫後,在用網頁把照片撈出來顯示

看更多先前的討論...收起先前的討論...
Ruei iT邦研究生 1 級 ‧ 2022-04-15 10:54:25 檢舉
雖然 py 這部分我不熟,我只知道我在 php 做這種事情會先把圖片變成 base64 的型態塞 db
froce iT邦大師 1 級 ‧ 2022-04-15 12:32:48 檢舉
python要這麼做一樣改成b64。

不過通常是建議存到某一資料夾,然後資料庫存路徑就好。
ddx iT邦研究生 5 級 ‧ 2022-04-15 14:23:27 檢舉
我轉成B64後一樣無法存入資料庫.....
他的值會是b'iVBORw0KGgoAAAANSUhEUgAAB4AAAAQ4CA........
froce iT邦大師 1 級 ‧ 2022-04-15 14:46:35 檢舉
轉成str啊。
kk999 iT邦新手 3 級 ‧ 2022-04-15 15:55:43 檢舉
同樓上,以前在Camera公司工作,圖像丟到filesystem,DB只放index
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
3
一級屠豬士
iT邦大師 1 級 ‧ 2022-04-15 11:26:05
最佳解答

SQL Server 有 image 資料型態,還有 binary 和 varbinary
image 點此過去看

binary 和 varbinary

一個範例

ddx iT邦研究生 5 級 ‧ 2022-04-15 14:38:21 檢舉

拍謝....這個範例一樣不行

不用拍謝,又不是我要做這件事,你自己要設法看懂跟修改.
錯誤訊息也不貼.

ddx iT邦研究生 5 級 ‧ 2022-04-18 11:25:58 檢舉

抱歉!我忘了貼了SOR 可以存了謝謝

2
海綿寶寶
iT邦大神 1 級 ‧ 2022-04-15 13:20:21

這篇寫得很好,不過年代久遠
這篇寫的是 update 而非 insert
不過可以學到用 parameter 的方式而非常見的組 SQL 字串的方式

ddx iT邦研究生 5 級 ‧ 2022-04-15 14:39:02 檢舉

拍謝....那篇一樣不行

不用拍謝
因為
那兩篇都可以

ddx iT邦研究生 5 級 ‧ 2022-04-18 11:26:14 檢舉

感謝您,可以了謝謝

9

一下就被兩位大佬給打槍。
你真的算很強了。

首先,你得先了解幾件事。
一般很少人會將2進位檔轉字串的模式。畢竟會有容量的問題存在。

正規用的招式是存實體檔,資料庫只存路徑位置。
如果非得要將二進位存入資料庫。
當然其一就是BASE64轉換法,也就是剛說的轉成字串的方式。
但這一招很危險。畢竟轉換成字串的情況。
其一有機會發生變數容量過大無法運行的問題。
基二有可能會有資料庫欄位容量無法儲存的問題。
大多數是用來存文件或是幾K的圖片才會用這招。

另外的方式,就是用SQL的指令宣告此為二進位欄位。
一般大多數來說,欄位格式大多得先設定二進制欄位。
才可以使用二進制的儲存方式處理。

其資料庫處理的方式,認真來說也是將檔案非直接儲存在資料表的位置。
它也是另外存成一個檔案,而資料表欄位內只有關聯對應。
看起來就像是將檔案存在資料庫內。

在你直接跟兩位大佬說不行的情況下。就可以了解一件事了。
你一定沒仔細看文章。直接將語法貼上使用。
而忽略了欄位需要調整的問題。
且就只回應了「不行」也不說哪邊不行,錯誤訊息也不說。
就只說「不行」

也難怪兩位SQL大佬會對你回這樣的話了。
請再回去注意看。那一定可以用。會不行只是因為你不行。
而不是人家說的不行

ddx iT邦研究生 5 級 ‧ 2022-04-18 11:28:10 檢舉

感謝回答,謝謝您的提醒

1
I code so I am
iT邦高手 1 級 ‧ 2022-04-16 23:05:04

正常SQL不行的話,可使用 sqlalchemy ORM 作法,如下:

  1. 先定義 Table:
from sqlalchemy import create_engine, Column, Integer, String, Text
from sqlalchemy.ext.declarative import declarative_base

Model = declarative_base(name='Model')

# Table 定義
class productlines(Model):
    __tablename__ = 'productlines'
    productLine = Column(String(100), nullable=False, primary_key=True)
    image = Column(Text, unique=True, nullable=True) # 影像欄位
  1. 新增:
from sqlalchemy import create_engine, Column, Integer, String, Text
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import scoped_session, sessionmaker, backref, relation
import base64
import model

DB_Connection_String = 'mysql+pymysql://root:PWD@localhost/classicmodels'
engine = create_engine(DB_Connection_String, echo=False)

model.Model.metadata.create_all(bind=engine)

session = scoped_session(sessionmaker(autocommit=False,
                                         autoflush=False,
                                         bind=engine))

# *********** 新增 ****************
# Convert image to binary format
with open('./lena.jpg', 'rb') as file:
    image_data = file.read()
encodestring = base64.b64encode(image_data)

# 有問題
# sql = "INSERT INTO productlines (productline, image) VALUES (%s, %s))"
# engine.execute(sql, ('XXX', encodestring))

obj = model.productlines(productLine='XXX2', image = encodestring)
session.add(obj)
session.commit()

  1. 查詢:
# *********** 查詢 ****************
query = session.query(model.productlines).filter(model.productlines.productLine == 'XXX2')
obj1 = query.first() 
print(obj1.productLine)

from PIL import Image
import io 
# Decode the string
binary_data = base64.b64decode(obj1.image)

# Convert the bytes into a PIL image
image = Image.open(io.BytesIO(binary_data))
  
# Display the image
image.show()
ddx iT邦研究生 5 級 ‧ 2022-04-18 11:28:26 檢舉

感謝您的回覆,謝謝

我要發表回答

立即登入回答