En SQLAlchemy, ¿cómo puedo completar o actualizar una tabla desde una declaración SELECT
?¿Cómo INSERT INTO t1 (SELECCIONAR * FROM t2) en SQLAlchemy?
Respuesta
SQLalchemy no crea esta construcción para usted. Puede usar la consulta desde el texto.
session.execute('INSERT INTO t1 (SELECT * FROM t2)')
EDIT:
Más de un año después, pero ahora en sqlalchemy 0.6+ you can create it:
from sqlalchemy.ext import compiler
from sqlalchemy.sql.expression import Executable, ClauseElement
class InsertFromSelect(Executable, ClauseElement):
def __init__(self, table, select):
self.table = table
self.select = select
@compiler.compiles(InsertFromSelect)
def visit_insert_from_select(element, compiler, **kw):
return "INSERT INTO %s (%s)" % (
compiler.process(element.table, asfrom=True),
compiler.process(element.select)
)
insert = InsertFromSelect(t1, select([t1]).where(t1.c.x>5))
print insert
Produce:
"INSERT INTO mytable (SELECT mytable.x, mytable.y, mytable.z FROM mytable WHERE mytable.x > :x_1)"
Otro EDITAR:
Ahora, 4 años después, la sintaxis se incorpora en SQLAlchemy 0.9 y se transfiere a 0.8.3; Usted puede crear cualquier select()
y luego utilizar el nuevo método de from_select()
Insert
objetos:
>>> from sqlalchemy.sql import table, column
>>> t1 = table('t1', column('a'), column('b'))
>>> t2 = table('t2', column('x'), column('y'))
>>> print(t1.insert().from_select(['a', 'b'], t2.select().where(t2.c.y == 5)))
INSERT INTO t1 (a, b) SELECT t2.x, t2.y
FROM t2
WHERE t2.y = :y_1
Como Noslko señaló en el comentario, ahora puede deshacerse de SQL prima: http://www.sqlalchemy.org/docs/core/compiler.html#compiling-sub-elements-of-a-custom-expression-construct
from sqlalchemy.ext.compiler import compiles
from sqlalchemy.sql.expression import Executable, ClauseElement
class InsertFromSelect(Executable, ClauseElement):
def __init__(self, table, select):
self.table = table
self.select = select
@compiles(InsertFromSelect)
def visit_insert_from_select(element, compiler, **kw):
return "INSERT INTO %s (%s)" % (
compiler.process(element.table, asfrom=True),
compiler.process(element.select)
)
insert = InsertFromSelect(t1, select([t1]).where(t1.c.x>5))
print insert
Produce:
INSERT INTO mytable (SELECT mytable.x, mytable.y, mytable.z FROM mytable WHERE mytable.x > :x_1)
Ahora no tiene que crear su propio ClauseElement. ¡Puedes usar el nuevo método 'Insert.from_select'! Ver mi respuesta – nosklo
A partir de 0,8. 3, ahora puede hacer esto directamente en sqlalchemy: Insert.from_select:
sel = select([table1.c.a, table1.c.b]).where(table1.c.c > 5)
ins = table2.insert().from_select(['a', 'b'], sel)
Gracias. Añadiré eso en la respuesta original. – nosklo
- 1. Combina automáticamente columnas en INSERT INTO ... SELECT ... FROM
- 2. TSQL: ACTUALIZAR con INSERT INTO SELECT FROM
- 3. ¿Cómo se implementa Tuple <T1,T2>. Crear <T1,T2> (T1 item1, T2 item2)?
- 4. Cómo hacer "INSERT INTO table1 (...) SELECT (...) FROM table2" en LINQ?
- 5. Rasgos de tipo C++ para seleccionar entre T1 y T2
- 6. INSERT vs INSERT INTO
- 7. INSERT INTO ... SELECT FROM ... ON DUPLICATE KEY UPDATE
- 8. Conversión entre Tuple <T1,T2> y KeyValuePair <T1, T2>
- 9. PostgreSQL: INSERT INTO ... (SELECT * ...)
- 10. 'insert into' con array
- 11. MySQL INSERT INTO table VALUES ... vs INSERT INTO table SET
- 12. Seleccionar valores nulos en SQLAlchemy
- 13. Seleccione un diccionario <T1, T2> con LINQ
- 14. INSERT INTO con subconsulta MySQL
- 15. ¿Cuándo utilizaría List <KeyValuePair <T1, T2>> en lugar de Dictionary <T1, T2>?
- 16. SELECCIONAR INTO utilizando Oracle
- 17. INSERT INTO en una instrucción CASE
- 18. Delegado para una acción < ref T1, T2>
- 19. MySQL INSERT o SELECCIONAR
- 20. INSERT INTO SELECT - gran cantidad de registros
- 21. Combinación de INSERT INTO y WITH/CTE
- 22. INSERT INTO SET sintaxis en SQL Server
- 23. Seleccionar como en sqlalchemy
- 24. Mejorar INSERT INTO - DE SELECCIÓN, consultas SQL
- 25. SELECCIONAR * FROM en MySQLi
- 26. diferencias entre INSERT seleccionar e insertar en seleccionar?
- 27. SQLite "INSERT O REPLACE INTO" no funciona
- 28. ¿Cómo automatizar un proceso INSERT INTO en SQLite?
- 29. mensaje de error al utilizar INSERT INTO
- 30. SQLAlchemy - INSERT O REPLACE equivalente
¿Sugeriría session.execute ('INSERT INTO t1 (% s)'% str (sqlalchemy_select_expression))? – joeforker
Claro, ¿por qué no? No necesita el 'str()', ya que '% s' ya lo hace. – nosklo
¿Todavía no se puede hacer ahora? – Hadrien