【问题标题】:How can I insert arrays into columns on a database table for my pyramid app?如何将数组插入到我的金字塔应用程序的数据库表的列中?
【发布时间】:2013-01-19 11:36:33
【问题描述】:

我正在尝试创建一个 sql (sqlite) 数据库,用户在其中上传 stl 文件,并且数据(所有点、三角形等)存储在数据库中,以便永久可用。是否可以对只有两列(三列带有键)的数据库执行此操作:名称(url 的标题)和数据(数组数据)?

数据数组的格式为:[[[x1,y1,z1],....],[[v1,v2,v3],...]]。首先给出所有点,然后通过给定点的排序来定义三角形。这个数组是否可以存储在数据库中,如果可以,它将是什么数据类型(整数、字符串等)?

在阅读更多这个问题后,似乎酸洗会是一个好方法:http://docs.python.org/2/library/pickle.html

我无法弄清楚如何实现这一点。我应该只添加泡菜(数据)吗?

编辑:经过进一步审查,似乎酸洗引入了一些使用 JSON 时不存在的安全漏洞。是否可以简单地调用jsondatastring=JSON.stringify(data),然后将其保存到数据库中?如果是这样,合适的列类型是什么?

【问题讨论】:

  • 你说的是“数据库”?什么样的?
  • 我认为是 sqlalchemy。我正在构建本教程:docs.pylonsproject.org/projects/pyramid/en/latest/tutorials/…
  • 那不是数据库——那是 ORM
  • 所以它是一个 SQL 数据库
  • 我认为 Jon 是在问您使用的是什么 RDBMS。例如。 PostgreSQL 有 ARRAY 类型,而(大多数?)其他人没有,所以您的问题的答案取决于正在使用的 RDBMS。

标签: python sqlalchemy pyramid pickle


【解决方案1】:

如果您的意图只是将数组存储在 DB 中并在您的 webapp 代码中使用它,SQLAlchemy 的PickleType 是一个不错的选择。酸洗和解酸将为您透明地完成:

from sqlalchemy.types import PickleType

class Foo(Base):
    __tablename__ = 'foo'
    id = Column(Integer, primary_key=True)
    name = Column(String)
    array = Column(PickleType)

foo = Foo(name=u'bar', array=[1, 2, 3])
session.add(foo)
session.commit()

foo = session.query(Foo).filter_by(name=u'bar').one()
print foo.array

【讨论】:

  • 当我尝试初始化数据库时,它给了我错误:PickleType 未定义。我应该在哪里定义它?
  • edit:我已经意识到酸洗不像将数组转换为 JSON 字符串并以这种方式序列化它那样合适。查看对问题的修改
  • 如果你读过PickleType的文档,你应该已经看到了类的全名:class sqlalchemy.types.PickleType(...。因此,您需要从sqlalchemy.types 导入它。或者它可以像任何其他类型一样从sqlalchemy 导入。我已经更新了我的答案以反映这一点。存储腌制数据也应该是安全的,因为是您保存它。不安全的是来自不受信任来源的腌制对象。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-06
  • 2011-07-30
  • 1970-01-01
  • 2020-10-17
  • 1970-01-01
  • 2018-03-06
  • 1970-01-01
相关资源
最近更新 更多