【问题标题】:Reading character Array instead of String Array from flask SQLAlchemy从烧瓶 SQLAlchemy 中读取字符数组而不是字符串数组
【发布时间】:2020-04-09 06:06:23
【问题描述】:

我在postgresql 中创建了一个下表。

class Test(db.Model):
    __tablename__ = 'Test'

    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String)
    genres = db.Column(db.ARRAY(db.String(120)))

为了将genres 保存到测试表中,我从 UI 中读取值并通过以下代码将其存储在数据库中,

genres = request.form.getlist('genres')
test = Test(name=name, genres=genres)
    db.session.add(test)
    db.session.commit()

在从数据库中读取它时,我会这样做,

test = Test.query.get(test_id)
data = test.serialize()
print(f'Data => {data}')

我遇到的问题是当我从测试表中读取genres 时,它会作为字符数组返回,

'genres': ['{', 'A', 'l', 't', 'e', 'r', 'n', 'a', 't', 'i', 'v', 'e', ',', 'B', 'l', 'u', 'e', 's', ',', 'C', 'l', 'a', 's', 's', 'i', 'c', 'a', 'l', '}']

而不是它们被创建/存储和保存到表中的方式,这是一个字符串数组,

genres = ['Alternative', 'Blues', 'Classical']

编辑:即使我在Serialization 发生之前写出结果,我仍然会看到这个问题。这是运行 `test.query.get('id') 时产生的genres

genres: ['{', 'A', 'l', 't', 'e', 'r', 'n', 'a', 't', 'i', 'v', 'e', ',', 'B', 'l', 'u', 'e', 's', ',', 'C', 'l', 'a', 's', 's', 'i', 'c', 'a', 'l', '}']

我做错了什么?

【问题讨论】:

  • 您找到解决此问题的方法了吗?
  • 当我将列从db.String() 更改为db.ARRAY(db.String()) 而不迁移数据库时遇到了这个问题。 flask-migrate 工具未检测到任何更改,因此我从头开始创建表并在 alembic 脚本中使用此行来创建列:sa.Column('name', sa.ARRAY(sa.String()), nullable=True)
  • 最近我必须处理这种错误,由于某种原因,我在创建一个名称设置为 camelCase 而不是 snake_case。因此,如果是您的情况,请使用 snake_case __tablename__ = "table_name" 删除表,然后将其删除,然后创建新表

标签: python arrays postgresql sqlalchemy flask-sqlalchemy


【解决方案1】:

我最近遇到了这个问题,无法找到根本原因。奇怪的是行为不一致。其中一张表将正确转换为 JSON,而另一些则不会。

我的解决方案是编写一个修复损坏格式的函数。

def fix_json_array(obj, attr):
    arr = getattr(obj, attr)
    if isinstance(arr, list) and len(arr) > 1 and arr[0] == '{':
        arr = arr[1:-1]
        arr = ''.join(arr).split(",")
        setattr(obj,attr, arr)

然后我在查询表后简单地放这个。

record = myTable.query.get(row_id)
fix_json_array(record, "genres")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-03
    • 2021-09-20
    • 2013-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-20
    • 1970-01-01
    相关资源
    最近更新 更多