在表格中格式化数组数据

时间:2017-12-14 06:04:01

标签: python postgresql

数据以以下格式显示:

members

我正在将这些数据写入表格:

tags_list = [
    ['foo'],
    ['foo', 'boo', 'goo'],
    ['boo', 'zoo']
]

但是这样,表格中的数据变为for tags in tags_list: cursor.execute("""INSERT INTO tags_table VALUES (%s);""", (tags,))

tuple

虽然我期待:

(['foo'],)
(['foo', 'boo', 'goo'],)
(['boo', 'zoo'],)

是否可以将数据转换为普通的PostgreSQL的ARRAY视图?

2 个答案:

答案 0 :(得分:2)

我只需按照sql

创建一个表格
CREATE TABLE contacts (
 id serial PRIMARY KEY,
 name VARCHAR (100),
 phones TEXT []
);

我假设您使用pydb并且我创建了一个类似于以下节目的表

 id | name |    phones    
----+------+--------------
  1 |      | {123,222,33}

我的python代码只是简单地插入到一个列表中。

import pgdb


conn = pgdb.connect(database='test')


cur = conn.cursor()

lst = ['123','222','33']
cur.execute('insert into contacts(phones) values (%s)', (lst,))
conn.commit()

它为我工作!我猜你没有commit你的光标或你的字段类型不对!

回到你的例子,我创建了一个类似你的表:

CREATE TABLE tags_table(tags TEXT[]);

在运行我的python代码之前,请检查表。

test=# select * from tags_table;
 tags 
------
(0 rows)

和我的python代码:

#import pgdb
#conn = pgdb.connect(database='test')
#if psycopg2 has used
#try this 
import psycopg2
conn = psycopg2.connect(database='test')
cursor = conn.cursor()

tags_list = [
    ['foo'],
    ['foo', 'boo', 'goo'],
    ['boo', 'zoo']
]


for tags in tags_list:
    cursor.execute("""INSERT INTO tags_table(tags) VALUES (%s);""", (tags,))

conn.commit()

运行上面的代码后,我的表得到了这些结果:

test=# select * from tags_table;
     tags      
---------------
 {foo}
 {foo,boo,goo}
 {boo,zoo}
(3 rows)

我真的不明白为什么你需要将结果显示为{},但有一种简单的方法可以通过声明自己的List类型来实现。

class MyList(list):
    def __str__(self):
        items = ','.join(self)
        return '{' +'{}'.format(items if items else '') + '}'
    def __repr__(self):
        return self.__str__()


for i in d:
    j = MyList(i[0])
    print j

你将得到如下显示的结果!

{foo}
{foo,boo,goo}
{boo,zoo}
{foo}
{foo,boo,goo}
{boo,zoo}

答案 1 :(得分:0)

这是一些妥协解决方案:

cursor.execute("""SELECT * FROM tags_table;""")
rows = cursor.fetchall()
for row in rows:
    print(row[0])

¯\ _(ツ)_ /¯