J'utilise Python 2.7 et postgresql 9.1. En essayant d’obtenir un dictionnaire à partir d’une requête, j’ai essayé le code décrit ci-après: http://wiki.postgresql.org/wiki/Using_psycopg2_with_PostgreSQL }
import psycopg2
import psycopg2.extras
conn = psycopg2.connect("dbname=mydb Host=localhost user=user password=password")
cur = conn.cursor(cursor_factory=psycopg2.extras.DictCursor)
cur.execute ("select * from port")
type(cur.fetchall())
Il imprime la réponse suivante:
<type 'list'>
en imprimant l’article lui-même, montrez-moi qu’il s’agit de la liste .
Modifier:
Essayer le suivant:
ans = cur.fetchall()[0]
print ans
print type(ans)
résultats
[288, 'T', 51, 1, 1, '192.168.39.188']
<type 'list'>
C'est normal: lorsque vous appelez la méthode .fetchall (), la liste des tuples est renvoyée. Mais si vous écrivez
type(cur.fetchone())
il retournera un seul Tuple avec le type:
<class 'psycopg2.extras.DictRow'>
Après cela, vous pouvez l’utiliser comme liste ou comme dictionnaire:
cur.execute('SELECT id, msg FROM table;')
rec = cur.fectone()
print rec[0], rec['msg']
Aussi, vous pouvez utiliser un simple itérateur de curseur:
res = [json.dumps(dict(record)) for record in cursor] # it calls .fecthone() in loop
Merci beaucoup Andrey Shokhin,
la réponse complète est:
#!/var/bin/python
import psycopg2
import psycopg2.extras
conn = psycopg2.connect("dbname=uniart4_pr Host=localhost user=user password=password")
cur = conn.cursor(cursor_factory=psycopg2.extras.DictCursor)
cur.execute ("select * from port")
ans =cur.fetchall()
ans1 = []
for row in ans:
ans1.append(dict(row))
print ans1 #actually it's return
Peut-être pour l'optimiser davantage, nous pouvons avoir
#!/var/bin/python
import psycopg2
import psycopg2.extras
def get_dict_resultset(sql):
conn = psycopg2.connect("dbname=pem Host=localhost user=postgres password=Drupal#1008")
cur = conn.cursor(cursor_factory=psycopg2.extras.DictCursor)
cur.execute (sql)
ans =cur.fetchall()
dict_result = []
for row in resultset:
dict_result.append(dict(row))
return dict_result
sql = """select * from tablename"""
return get_dict_resultset(sql)
Pour moi, lorsque je convertis la ligne en dictionnaire a échoué (les solutions mentionnées par d'autres) et que je ne pouvais pas non plus utiliser la fabrique de curseurs. J'utilise PostgreSQL 9.6.10, Le code ci-dessous a fonctionné pour moi, mais je ne suis pas sûr que ce soit la bonne façon de le faire.
def convert_to_dict(columns, results):
"""
This method converts the resultset from postgres to dictionary
interates the data and maps the columns to the values in result set and converts to dictionary
:param columns: List - column names return when query is executed
:param results: List / Tupple - result set from when query is executed
:return: list of dictionary- mapped with table column name and to its values
"""
allResults = []
columns = [col.name for col in columns]
if type(results) is list:
for value in results:
allResults.append(dict(Zip(columns, value)))
return allResults
Elif type(results) is Tuple:
allResults.append(dict(Zip(columns, results)))
return allResults
Manière de l'utiliser:
conn = psycopg2.connect("dbname=pem Host=localhost user=postgres,password=Drupal#1008")
cur = conn.cursor()
cur.execute("select * from tableNAme")
resultset = cursor.fetchall()
result = convert_to_dict(cursor.description, resultset)
print(result)
resultset = cursor.fetchone()
result = convert_to_dict(cursor.description, resultset)
print(result)