Estoy tratando de llenar un par de bases de datos con psycopg2 dentro de un servidor del que no soy el usuario raíz (no sé si es relevante o no). mi código parece
import json from psycopg2 import connect cors = connect(user='jungal01', dbname='course') req = connect(user="jungal01", dbname='requirement') core = cors.cursor() reqs = req.cursor() with open('gened.json') as gens: geneds = json.load(gens) for i in range(len(geneds)): core.execute('''insert into course (number, description, title) values({0}, {1}, {2});''' .format(geneds[i]["number"], geneds[i]['description'], geneds[i]['title'] )) reqs.execute('''insert into requirement (fulfills) values({0});''' .format(geneds[i]['fulfills'] )) db.commit()cuando ejecuto el código, aparece el error pycopg2 anterior. Sé que existen estas bases de datos en particular, pero no puedo entender por qué no se conecta a mis bases de datos. (búsqueda secundaria, tampoco estoy seguro acerca de esa declaración de compromiso. ¿Debería estar en el bucle for o fuera de él? ¿Se supone que es específico de la base de datos?)
Primero, tiene db no es una variable definida, por lo que su código no debería ejecutarse completamente de todos modos.
\list en este servidor es un montón de bases de datos llenas de nombres de usuario, de los cuales mi nombre de usuario es uno
Entonces lo siguiente es cómo debe conectarse. A una base de datos, no a una tabla, y el patrón regular es poner el nombre de la base de datos y luego el usuario/contraseña.
Un "esquema" es un término suelto en la base de datos relacional. Tanto las tablas como las bases de datos tienen esquemas, pero parece que espera conectarse a una tabla, no a una base de datos.
Por lo tanto, pruebe este código con un intento de solucionar su problema de sangría e inyección de SQL. Consulte esta documentación .
Tenga en cuenta que primero debe haber creado las dos tablas en la base de datos a la que se está conectando.
import json from psycopg2 import connect username = 'jungal01' conn = connect(dbname=username, user=username) cur = conn.cursor() with open('gened.json') as gens: geneds = json.load(gens) for g in geneds: cur.execute('''insert into course (number, description, title) values(%(number)s, %(description)s, %(title)s);''', g) cur.execute('''insert into requirement (fulfills) values(%(fulfills)s);''', g) conn.commit()Allen, dijiste: "en postgres, las tablas son bases de datos". Eso es absolutamente incorrecto. Su mensaje de error resulta de este malentendido. Desea conectarse a una base de datos e insertar en una tabla que existe en esa base de datos. Está intentando insertar en una base de datos, una operación sin sentido.
Asegúrese de dar el nombre del catálogo como nombre de la base de datos y no el esquema del catálogo.
El catálogo es confuso y bastante innecesario. Más detalles a continuación: ¿Cuál es la diferencia entre un catálogo y un esquema en una base de datos relacional?