2010-06-17 8 views
0

Est-il possible, dans PostgreSQL accédé à partir de Python à l'aide de SQLObject, de créer une table temporaire à partir des résultats d'un curseur?créer une table temporaire à partir du curseur

Auparavant, j'avais une requête, et j'ai créé la table temporaire directement à partir de la requête. J'ai ensuite eu beaucoup d'autres requêtes interagissant avec cette table temporaire.

Maintenant, j'ai beaucoup plus de données, donc je veux traiter seulement 1000 lignes à la fois. Cependant, je ne peux pas faire CREATE TEMP TABLE ... AS ... à partir d'un curseur, pas aussi loin que je peux voir. Est-ce que la seule chose à faire quelque chose comme:

rows = cur.fetchmany(1000); 
cur2 = conn.cursor() 
cur2.execute("""CREATE TEMP TABLE foobar (id INTEGER)""") 
for row in rows: 
    cur2.execute("""INSERT INTO foobar (%d)""" % row) 

ou y a-t-il un meilleur moyen? Cela semble terriblement inefficace.

Répondre

0

J'ai fini par faire ceci:

 sql.execute(connection, """ 
INSERT INTO blah VALUES %s;""" % (
    ", ".join("(%d)" % hid for hid in hids))) 

au lieu de 1000 inserts séparés. Je ne connais pas encore mieux, mais cela fonctionne assez bien.

0

Je ne l'ai pas utilisé PostgreSQL mais je sais que pour insérer les résultats d'une procédure stockée vous faire:

INSERT INTO #SHIPINFO 
exec TESTDTA.S59RSH05 @SCBILLTO, @INID, @ADRSTYPE 

Taken de here.

Alors pourriez-vous faire quelque chose de similaire. envoyer Peut-être que les résultats du curseur dans son ensemble si quelque chose comme:

CREATE TEMP TABLE foobar (id INTEGER) 
INSERT INTO foobar 'rows' 
1

Eh bien Postgres est en train de lire le compte rendu du curseur par enregistrement et que vous êtes juste 1000 de ceux qui l'appel fetchmany et de les charger dans la mémoire. Je ne suis pas sûr de savoir comment vous attendriez vraiment ce que vous demandez de travailler.

Une version plus performante de cela s'assurerait que tous ces INSERTS ont été enveloppés dans un seul BEGIN et END afin que sa seule transaction.

Y a-t-il une raison pour le curseur, par opposition à simplement ajouter une colonne via row_number() dans une table temporaire pour commencer avec - afin que son ordonné?

Questions connexes