Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从Alchemy读取字符数组而不是字符串数组_Python_Arrays_Postgresql_Sqlalchemy_Flask Sqlalchemy - Fatal编程技术网

Python 从Alchemy读取字符数组而不是字符串数组

Python 从Alchemy读取字符数组而不是字符串数组,python,arrays,postgresql,sqlalchemy,flask-sqlalchemy,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))) 为了将genres保存到测试表中,我从UI中读取值,并通过以下代码将其存储在DB中 genres

我在
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中读取值,并通过以下代码将其存储在DB中

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': ['{', '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']
编辑:即使我在
序列化
发生之前编写结果,我仍然会看到这个问题。下面是运行“test.query.get('id')时产生的
genres


我做错了什么

我最近遇到了这个问题,无法找到根本原因。奇怪的是,这种行为并不一致。其中一个表将正确转换为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")

您找到解决此问题的方法了吗?在未迁移数据库的情况下,我将列从
db.String()
更改为
db.ARRAY(db.String())
时遇到此问题。flask migrate工具没有检测到任何更改,因此我从头开始创建表,并在alembic脚本中使用这一行创建列:
sa.column('name',sa.ARRAY(sa.String()),nullable=True)
。最近我不得不管理此类错误,出于某种原因,我在创建了一个数据库之后复制了这个问题,该数据库的名称是在camelCase而不是snake_case上设置的。因此,如果是您的情况,则使用snake\u case
\uu tablename\uu=“table\u name”
record = myTable.query.get(row_id)
fix_json_array(record, "genres")