How to write an Image to the SQLAlchemy database and retrieve it [duplicate]
I want to store audio files in my database. I know, for example, that strings would use db.String
, integers db.Integer
, but not what audio data would use. What data type is used to store this type of data in SQLAlchemy?
class Audio(db.Model):
__tablename__ = 'audio'
id = db.Column(db.Integer, primary_key=True)
timestamp = db.Column(db.DateTime, index=True, default=datetime.utcnow)
author_id = db.Column(db.Integer, db.ForeignKey('users.id'))
title = db.Column(db.String(64), unique=True)
Solution 1:
When storing binary data, use the LargeBinary
type. Despite its name, it is appropriate for any sized binary data.
data = db.Column(db.LargeBinary)
Read the data from the uploaded file in your Flask view.
audio.data = request.files['data'].read()
Rather than storing the data in the database, it's typically better to store files in the filesystem, and store the path to the file in the database.
Since you're presumably serving these files, not just storing them, it is much more efficient to serve the files from the filesystem. See this answer for more discussion on serving data from the database.
Solution 2:
I would not recommend storing the audio files in a database, you should store them in files then store the file paths in the database, this post discuses storing binary data in a database.
So when a file is uploaded you can use the id of the database row as the file name and then read it from disk back to the client. this also allows easier partial reading of the file when you are streaming audio (HTTP 206), you will also need to store the mime-type of the audio in the database if you are working with more than one audio format, and if you want to preserve the original filename you need to store that also.