从 Flask SQLAlchemy 读取字符数组而不是字符串数组

Ahm*_*med 8 python arrays postgresql sqlalchemy flask-sqlalchemy

我在 中创建了下表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)))
Run Code Online (Sandbox Code Playgroud)

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

genres = request.form.getlist('genres')
test = Test(name=name, genres=genres)
    db.session.add(test)
    db.session.commit()
Run Code Online (Sandbox Code Playgroud)

当我从数据库中读取它时,

test = Test.query.get(test_id)
data = test.serialize()
print(f'Data => {data}')
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是当我从测试表中读取时,它作为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', '}']
Run Code Online (Sandbox Code Playgroud)

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

genres = ['Alternative', 'Blues', 'Classical']
Run Code Online (Sandbox Code Playgroud)

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

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', '}']
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

小智 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)
Run Code Online (Sandbox Code Playgroud)

然后我只是在查询表后将其放入。

record = myTable.query.get(row_id)
fix_json_array(record, "genres")
Run Code Online (Sandbox Code Playgroud)