将sql转换为json的有效方法

时间:2014-06-11 06:41:22

标签: python sql json

嗨我有一个大约1000000行的数据库。由于我想使用mongodb,我编写了以下代码将其转换为json,但需要花费很多时间。还有另一种方法可以解决这个问题。

import psycopg2
import json
con = psycopg2.connect(database)
cur = con.cursor()
sql="select * from mini; "
cur.execute(sql) 
rows=cur.fetchall()
json_string=[]
for sample in rows:
    #print(sample)
    dicti={"label1":sample[0],"label2":sample[1],"label3":sample[2]}
    #print(json.dumps(dicti))
    json_string.append(dicti)
f=open('xyz.txt','w')
print >>f,json_string
f.close()

这里label1,label2,label3是sql的列名,如果有帮助的话。

4 个答案:

答案 0 :(得分:1)

您正在为每一行创建一个字典,然后将其转换为字符串。跳过转换并手动创建json。我用timeit模块测试了几种方法:

  1. 使用str.format:
  2. >>> '{{"label1": {0}, "label2": {1}, "label3": {2}}}'.format('1','2','3')
    >>> timeit.timeit("""'{{"label1": {0}, "label2": {1}, "label3": {2}}}'.format('1','2','3')""")
    1.3898658752441406
    
    1. 将字符串添加到一起:
    2. >>> '{"label1": ' + '1' + ', "label2": ' + '2' + ', "label3": ' + '3' + '}'
      >>> timeit.timeit("""'{"label1": ' + '1' + ', "label2": ' + '2' + ', "label3": ' + '3' + '}'""")
      0.506464958190918
      
      1. 创建词典:
      2. >>> str({"label1": '1', "label2": '2', "label3": '3'})
        >>> timeit.timeit(""" str({"label1": '1', "label2": '2', "label3": '3'}) """)
        4.776309013366699
        

        如何创建json还有其他可能性。

答案 1 :(得分:1)

使用DictCursor会更简单,它将从您的数据库中返回字典:

import psycopg2
import json

cur = conn.cursor(cursor_factory=psycopg2.extras.DictCursor)
rows = cur.execute('SELECT * FROM mini')
with open('xyz.txt', 'w') as f:
    for row in rows:
        f.write('{}\n'.format(json.dumps(row)))

要将整个数据集转储为一个大型json对象,请改为:

cur = conn.cursor(cursor_factory=psycopg2.extras.DictCursor)
rows = cur.execute('SELECT * FROM mini')
dataset = list(rows)
with open('xyz.txt', 'w') as f:
   json.dump(dataset, f)

答案 2 :(得分:0)

如果获取部分是花费大部分时间的地方,那可能是因为你需要大量内存而系统必须进行许多重新分配,甚至更糟糕的是交换。您可以尝试使用fetchmany而不是带有合理大小的fetchall,并且(相同)通过块写入磁盘。

所以你会有类似的东西:

import psycopg2
import json
con = psycopg2.connect(database)
cur = con.cursor()
sql="select * from mini; "
cur.execute(sql)
size = 256 # find a 'good' size
with open('xyz.txt', 'w') as f:
    while True:
        rows=curs.fetchmany(size)
        if len(rows) == 0:
            break
        json_string=[]
        for sample in rows:
            #print(sample)
            dicti={"label1":sample[0],"label2":sample[1],"label3":sample[2]}
            #print(json.dumps(dicti))
            json_string.append(dicti)
        print >>f,json_string

答案 3 :(得分:0)

这应该有效:

cur = conn.cursor(cursor_factory=psycopg2.extras.DictCursor)
sql = "SELECT row_to_json(row) FROM (select * from mini) row;"
cur.execute(sql)
result = cur.fetchone()
result[0]
# -> [{'col1':'val1', 'col2':'val2', ...}]