2016-05-27 6 views
2

, wenn ich das Programm application.py ausführen, ich diesen Fehler:Wie programmatisch mit Tabellenstruktur erhalten pyscopg2

psycopg2.ProgrammingError 
ProgrammingError: ERREUR: erreur de syntaxe sur ou près de « "/d" » 
LINE 1: "/d" carto."BADGES_SFR" 

(in Englisch "ProgrammingError: ERREUR: syntax error at or near « "/d" » ") für dieses Programm Mein Ziel ist es, den Tisch zu bekommen

Struktur

dies ist der folgende Code application.py:

#!/usr/bin/python 2.7.6 
# -*- coding:utf-8 -*- 
import os 
import sys 
from flask import Flask,render_template 
import psycopg2 
reload(sys) 
sys.setdefaultencoding('utf8') 
app = Flask(__name__) 

@app.route('/') 
def fihoum(): 
    conn = psycopg2.connect(database="carto", user="postgres", password="daed5Aemo", host="192.168.12.54") 
    cur = conn.cursor() 
    #cur.execute("SELECT * FROM carto.\"BADGES_SFR\"") 
    cur.execute("/d carto.\"BADGES_SFR\"") 
    rows = cur.fetchall() 
    return render_template('hello.html', titre="Données du client BADGES_SFR !",mots=rows) 

if __name__=="__main__": 
    app.run(host=os.getenv('IP', '0.0.0.0'), 
      port=int(os.getenv('PORT',5000)), 
      debug=True) 
+0

Läuft es mit der cur.execute ("SELECT * FROM carto. \" BADGES_SFR \ "") Zeile? –

+0

Ja, es läuft mit cur.execute ("SELECT * FROM carto. \" BADGES_SFR \ "") –

+0

Würde die cur.execute ("\ d carto. \" BADGES_SFR \ "") es lösen, wie @bakkal es vorgeschlagen hat? –

Antwort

1

Zunächst einmal ist es \d <table_name> (man beachte den Backslash \d nicht /d) ist, aber das ist nur in der psql interaktiven Terminal

My [objective] with this program is to get the table structure

können Sie die SQL-Tabelle information_schema.columns verwenden, die die Information trägt, die Sie wollen

SELECT column_name, data_type, is_nullable 
FROM information_schema.columns 
WHERE table_name = '<table_name>'; 

    column_name  |  data_type  | is_nullable 
--------------------+-------------------+------------- 
column_a   | integer   | YES 
column_b   | boolean   | NO 

Hier ist eine Liste der verfügbaren Spalten: https://www.postgresql.org/docs/9.4/static/infoschema-columns.html

Snip pet

import psycopg2 
conn = psycopg2.connect(database='carto', user=..., password=...) 

q = """        
SELECT column_name, data_type, is_nullable 
FROM information_schema.columns 
WHERE table_name = %s; 
""" 

cur = conn.cursor() 
cur.execute(q, ('BADGES_SFR',)) # (table_name,) passed as tuple 
cur.fetchall() 

# Example Output 
[('column_a', 'integer', 'YES'), 
('column_b', 'boolean', 'NO'), 
..., 
] 

Tipp für Jinja2/Flask Integration:

Betrachten psycopg2.extras.DictCursor verwendet, wird es macht es einfacher für Sie, die Informationen basierend auf den Spaltennamen (dict-Taste) in der Flasche zu ziehen Vorlage, weil Sie ein Diktat haben, auf das Sie zB zugreifen können mit row['data_type'], row['column_name'] usw.

+0

Ich hatte meinen Code ändern, und jetzt funktioniert es –

+0

@ZaafLafalaise Kann ich was genau fragen für dich gearbeitet? – bakkal

0

Wenn Sie nur die Spalten description:

>>> cur.execute('select * from t') 
>>> description = cur.description 
>>> print description 
(Column(name='record_timestamptz', type_code=1184, display_size=None, internal_size=8, precision=None, scale=None, null_ok=None),) 
>>> columns = description[0] 
>>> print columns.name, columns.type_code 
record_timestamptz 1184 

Für den Datentyp-Name-Cache die pg_type Bezug auf die Anwendung starten und ein Wörterbuch machen:

cursor = conn.cursor(cursor_factory=psycopg2.extras.DictCursor) 

cursor.execute ('select oid, * from pg_type') 

pg_type = dict([(t['oid'], t['typname']) for t in cursor.fetchall()]) 

cursor.execute ('select * from t') 

for t in cursor.description: 
    print t.name, t.type_code, pg_type[t.type_code] 
Verwandte Themen