sqlite 声明图像字段的正确方法sqlalchemy

k3bvogb1  于 2023-01-17  发布在  SQLite
关注(0)|答案(4)|浏览(176)

我正在尝试用flask构建和应用程序,我看过一些教程和书籍以及一些代码[1],他们解释了如何为数据库设置声明整数和字符串。但是,他们没有解释如何存储图像。我现在非常困惑,我认为存储图像的自然方式是在数据库上,但是阅读一些flask站点上的文档[2]文件系统是存储映像的地方。我只是在阅读flask开发书籍时做了一个第一假设,即使用largeBinary声明是正确的,但这只是我的猜测,你可以在下面的代码中看到。有人能帮我弄清楚吗?如果我问的不清楚,请让我知道。

Class User(Base):
    __table__ = 'user'

    id = Column(Integer, primary_key = True)
    name  Column(String(80), nullable=False)
    email =  Column(String(250), nullable=False)
    image = Column(LargeBinary, nullable = True)

[1][https://github.com/lobrown/Full-Stack-Foundations/blob/master/Lesson_1/database_setup.py](https://github.com/lobrown/Full-Stack-Foundations/blob/master/Lesson_1/database_setup.py) [2] http://flask.pocoo.org/docs/0.10/patterns/fileuploads/

von4xj4u

von4xj4u1#

有一个叫做SQLAlchemy-ImageAttach的库,它提供了一种创建带有图像对象的实体的方法,这些实体可以通过url公开。
否则,您可以直接通过SingleImageSet类获得文件对象。
使用库,您可以从两个存储中进行选择,如文件系统或Amazon的S3。在文档中有一个描述的示例(灰色框),说明如何预先定义存储,然后定义用户实体并拥有UserPicture实体。

from sqlalchemy import Column, ForeignKey, Integer, Unicode
from sqlalchemy.orm import relationship
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy_imageattach.entity import Image, image_attachment

Base = declarative_base()

class User(Base):
"""User model."""

    id = Column(Integer, primary_key=True)
    name = Column(Unicode, nullable=False)
    picture = image_attachment('UserPicture')
    __tablename__ = 'user'

class UserPicture(Base, Image):
    """User picture model."""

    user_id = Column(Integer, ForeignKey('user.id'), primary_key=True)
    user = relationship('User')
    __tablename__ = 'user_picture'

我不知道Flask,但是也许你可以通过wsgi声明和这里的Lib一起使用一个文件存储器。我希望它能帮助你一点,给你一些**。

okxuctiv

okxuctiv2#

我在这篇文章[1]中读到,最好的方法是将图像字段声明为一个字符串,以保存到图像的URL或链接,然后可以将图像存储在外部服务器中,与应用程序的服务器不同。所以如果有人有同样的疑问,只需将其声明为字符串,然后继续进行应用程序开发。对数据库管理系统有点失望的是,它们只能用于存储数字和字母数据(:p)。
[1][https://www.reddit.com/r/flask/comments/31tywp/afbest_way_to_store_avatars_images_etc/](https://www.reddit.com/r/flask/comments/31tywp/afbest_way_to_store_avatars_images_etc/)

qlfbtfca

qlfbtfca3#

如果你要散列你的图像文件,你可能想要用一个字符串来替换LargeBinary,然后你可以设置一个图像值,例如

class User(Base):
        image = Column(string(int), nullable=True, 
temp='thepicture.jpg')

假设图片保存为thepicture.jpg

j2cgzkjk

j2cgzkjk4#

你不应该把大量的二进制数据(图像等)保存到数据库中。数据库不是设计用来存储文件的,所以你这样做只会破坏数据库的性能。
就像你已经推测的那样,更好的方法是将文件保存到磁盘上,然后将图像文件名存储到数据库中。额外的好处是,当你的应用程序变得更大时,你可以将图像存储到一些磁盘服务器或云或其他地方,所有的Web主机都可以从那里访问文件。
如果你愿意,你可以为你的图片找到一些好的文件夹结构,例如一个文件夹来存放个人资料图片等。但是对于现代的文件系统来说,这实际上一点也不重要。毕竟,你可能不需要手工管理这些文件,所以从磁盘中找到特定的文件并不重要。
编辑:我忘了提到,在某些时候,你可能想从其他服务器而不是动态 flask 应用程序来服务你的静态内容(图像,css,js文件)。如果你从一开始就考虑到这个想法来设计你的系统,将来的扩展会更容易。

相关问题