2010-06-18 4 views
7

Così ho alcuni risultati che ho ottenuto dalla tabella install, in questo modo:SQLAlchemy: Inserimento i risultati di una query in un'altra tabella

install = metadata.tables['install'] 
results = session.query(install) #<sqlalchemy.orm.query.Query object> 

mi piacerebbe inserire questi stessi risultati nel install_archive tabella.

Non sono del tutto sicuro di come farlo, perché non voglio duplicare lo schema definendo un oggetto install-archive e quindi analizzando i risultati in questo. Credo di non usare l'ORM, perché sono solo che riflette (è il termine giusto?) Le tabelle e le sto interrogando.

Tutte le esercitazioni che riesco a vedere utilizzano l'ORM.

Un modo lento di farlo, in psudocode, sarebbe:

for id in result.all(): 
    install_archive.insert(install(id)) 

Grazie in anticipo!

+0

qual è lo scopo dell'esercizio? – van

+0

Van, sto tentando di eseguire alcune convalide sulla tabella 'install', e solo il sottoinsieme che convalida viene passato alla tabella' install_archive'. Sono sicuro che questa è una cosa semplice "spostare alcuni record da un tavolo all'altro, ma non tutti" ma non riesco a trovare un modo per farlo nei documenti. Continuerò a cercare. – 0atman

+0

sei sicuro di aver bisogno di farlo in python (usando SA), e non direttamente in MySQL? Perché? – van

risposta

0

Si può fare qualcosa di simile (cambiando il SELECT in base alle proprie esigenze). Assicurati solo che i due tavoli abbiano la stessa struttura.

INSERT INTO `table1` (SELECT * FROM `table2`); 
+0

Come faresti questo senza sql raw ma con un'espressione sqlalchemy? – Hadrien

+0

Non credo che si possa fare qualcosa del genere con SQLAlchemy. È possibile selezionare tutti i dati, quindi eseguire il ciclo e inserire nell'altra tabella, ma ciò sarebbe orribilmente inefficiente. Non si guadagna nulla dal farlo in "modo SQLAlchemy". Un'istruzione SQL come questa è abbastanza portatile. –

+0

Non penso che questo risponda alla domanda. –

5
install_archive \ 
.insert() \ 
.from_select(names=['col1', 'col2'], # array of column names that your query returns 
      select=session.query(install)) # your query or other select() object 

Questo si traduce in (PostgreSQL dialetto)

INSERT INTO install_archive (col1, col2) 
SELECT install.col1, install.col2 
FROM install;