如何将sql varchar数组转换为Python列表?

时间:2014-01-08 17:54:16

标签: python sql postgresql psycopg2

我正在使用psycopg2与Python2.7中的PostgreSQL数据库进行交互。

psycopg2首先在varchar字段中将列表保存在数据库中,然后我只需要返回相同的Python列表。

插入:

data = ['value', 'second value']
with psycopg2.connect(**DATABASE_CONFIG) as connection:
    cursor = connection.cursor()
    cursor.execute("INSERT INTO table_name (varchar_field) VALUES (%s)", (data)
    connection.commit()

在pgAdmin中,它看起来像:{value,second_value}

然后我尝试做这样的事情:

with psycopg2.connect(**DATABASE_CONFIG) as connection:
    cursor = connection.cursor()
    cursor.execute("SELECT varchar_field FROM table_name")

    for row in cursor:
        for data_item in row: # here I want to iterate through the saved list (['value', 'second_value']), but it returns string: '{value, second_value}'
            print data_item

我找到possible solution,但我不知道如何在我的代码中实现它。

那么,如何从sql ARRAY类型中检索回Python列表?

2 个答案:

答案 0 :(得分:1)

假设:

CREATE TABLE pgarray ( x text[] );
INSERT INTO pgarray(x) VALUES (ARRAY['ab','cd','ef']);

然后psycopg2将为您解决数组解包问题。观察:

>>> import psycopg2
>>> conn = psycopg2.connect('dbname=regress')
>>> curs = conn.cursor()
>>> curs.execute('SELECT x FROM pgarray;')
>>> row = curs.fetchone()
>>> row
(['ab', 'cd', 'ef'],)
>>> row[0][0]
'ab'
>>> print( ', '.join(row[0]))
ab, cd, ef

答案 1 :(得分:0)

psycopg2已经为你做了。如果PostgreSQL列类型是文本数组,即text [],你应该得到一个字符串的python列表。只是尝试访问查询返回的第一个项而不是整个结果元组:

for row in cursor:
    for data_item in row[0]:
    # Note the index '0' ^ here.
        print data_item