如何使用Flask模型在postgres中存储图像

时间:2016-06-06 09:08:26

标签: postgresql python-2.7 flask flask-sqlalchemy postgresql-9.3

我正在尝试使用烧瓶模型存储图像。我不知道如何在postgres中存储图像,因此我将图像编码为base64,并且我试图将结果文本存储在postgres中。它是有效的,但有任何建议的方法来使用烧瓶模型

存储编码的文本或postgres中的图像
class User_tbl(db.Model):
  id = db.Column(db.Integer,primary_key=True)
  mobile=db.Column(db.String(13),unique=True)
  country=db.Column(db.String(30))
  image=db.Column(db.String(256))

def __init__(self,mobile,country,image):
    self.mobile=mobile
    self.country=country
    self.image = image

4 个答案:

答案 0 :(得分:0)

我知道PostgreSQL中用于处理base64数据的编码和解码函数,请参阅:

https://www.postgresql.org/docs/current/static/functions-string.html

(编码/解码)

谢谢,

答案 1 :(得分:0)

避免所有这些编码和解码并简单地将其保存为二进制blob会容易得多。在这种情况下,请使用sqlalchemy.dialects.postgresql.BYTEA列。

答案 2 :(得分:0)

在postgres中存储图像的recomended方法是将图像存储在静态文件夹(存储Javascript和CSS文件)中,并通过Web服务器即nginx提供。它可以比flask更高效地完成它。你应该只在postgres上存储你的图像的路径,然后将实际的图像存储在文件系统上。

答案 3 :(得分:0)

我知道回答这个问题可能为时已晚,但是在这些日子里我试图解决类似的问题,所提出的解决方案似乎都没有解决主要问题。 当然,任何最佳实践都取决于您的需求。但总的来说,你会发现在数据库中嵌入一个文件不是一个好习惯。这得看情况。 阅读" Storing Binary files in the Database"由postgresql wiki制作,我发现有一些谨慎,其中强烈推荐这种做法,例如当文件必须是ACID时。 在这些情况下,至少在Postgres中,bytea数据类型优先于文本或BLOB二进制文件,有时以服务器的某些更高内存要求为代价。

在这种情况下: 1)你不需要特殊的sqlalchemy方言。 LargeBinary数据类型就足够了,因为它将被翻译为目标平台的#34;大和/或不变的二进制类型"。 2)在这种特定情况下,你不需要PostgreSQL中的任何编码/解码功能。 3)正如我之前所说,将文件保存到文件系统并不总是一个好策略。在任何情况下都不要使用带有base64编码的文本数据类型。您的数据会或多或少地膨胀33%,从而导致巨大的存储影响,而bytea具有不同的缺点

因此,我建议对您的模型进行这些更改:

class User_tbl(db.Model):
  id = db.Column(db.Integer,primary_key=True)
  mobile=db.Column(db.String(13),unique=True)
  country=db.Column(db.String(30))
  image=db.Column(db.LargeBinary)

然后您只需将FileStorage参数作为二进制文件传递即可将文件保存到Postgres中:

image = request.files['fileimg'].read()