這是我的語法
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存入到資料庫後,在用網頁把照片撈出來顯示
一下就被兩位大佬給打槍。
你真的算很強了。
首先,你得先了解幾件事。
一般很少人會將2進位檔轉字串的模式。畢竟會有容量的問題存在。
正規用的招式是存實體檔,資料庫只存路徑位置。
如果非得要將二進位存入資料庫。
當然其一就是BASE64轉換法,也就是剛說的轉成字串的方式。
但這一招很危險。畢竟轉換成字串的情況。
其一有機會發生變數容量過大無法運行的問題。
基二有可能會有資料庫欄位容量無法儲存的問題。
大多數是用來存文件或是幾K的圖片才會用這招。
另外的方式,就是用SQL的指令宣告此為二進位欄位。
一般大多數來說,欄位格式大多得先設定二進制欄位。
才可以使用二進制的儲存方式處理。
其資料庫處理的方式,認真來說也是將檔案非直接儲存在資料表的位置。
它也是另外存成一個檔案,而資料表欄位內只有關聯對應。
看起來就像是將檔案存在資料庫內。
在你直接跟兩位大佬說不行的情況下。就可以了解一件事了。
你一定沒仔細看文章。直接將語法貼上使用。
而忽略了欄位需要調整的問題。
且就只回應了「不行」也不說哪邊不行,錯誤訊息也不說。
就只說「不行」
也難怪兩位SQL大佬會對你回這樣的話了。
請再回去注意看。那一定可以用。會不行只是因為你不行。
而不是人家說的不行
正常SQL不行的話,可使用 sqlalchemy ORM 作法,如下:
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) # 影像欄位
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()
# *********** 查詢 ****************
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()