В SQLAlchemy, как мне заполнить или обновить таблицу из инструкции SELECT
?Как сделать INSERT INTO t1 (SELECT * FROM t2) в SQLAlchemy?
ответ
SQLalchemy не создает эту конструкцию для вас. Вы можете использовать запрос из текста.
session.execute('INSERT INTO t1 (SELECT * FROM t2)')
EDIT:
Более чем через год, но теперь на 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
Производит:
"INSERT INTO mytable (SELECT mytable.x, mytable.y, mytable.z FROM mytable WHERE mytable.x > :x_1)"
Другой EDIT:
Теперь, через 4 года, синтаксис включен в SQLAlchemy 0.9 и backported до 0.8.3; Вы можете создать любое select()
, а затем использовать новый метод from_select()
из Insert
объектов:
>>> 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
Как Noslko отметил в комментарии, теперь вы можете избавиться от сырой SQL: 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
Производит:
INSERT INTO mytable (SELECT mytable.x, mytable.y, mytable.z FROM mytable WHERE mytable.x > :x_1)
Теперь вам не нужно создавать свой собственный элемент ClauseElement. Вы можете использовать новый метод 'Insert.from_select'! См. Мой ответ. – nosklo
В 0.8. 3, вы можете сделать это прямо в 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)
Спасибо. Я добавлю это в оригинальный ответ. – nosklo
- 1. MySQL: ЕСЛИ t1.row1 = t1.row2 INSERT INTO t2
- 2. mysql SELECT "FROM t1, t2" -или- "FROM t1 JOIN t2 ON"
- 3. SELECT FROM и INSERT INTO
- 4. Автоматически сопоставлять столбцы в INSERT INTO ... SELECT ... FROM
- 5. SQL INSERT INTO FROM SELECT
- 6. Как INSERT INTO ... SELECT ... FROM ... WHERE работает?
- 7. INSERT INTO TARGET_TABLE SELECT * FROM SOURCE_TABLE;
- 8. INSERT INTO SELECT FROM ДОСТУПА К ORACLE
- 9. INSERT INTO ... FROM SELECT ... RETURNING id сопоставления
- 10. Улучшение INSERT INTO - FROM SELECT, SQL Query
- 11. Процедура SELECT требует INSERT INTO?
- 12. Postgresql - INSERT INTO на основе нескольких SELECT
- 13. sqlalchemy INSERT от SELECT
- 14. PostgreSQL INSERT SELECT, FROM с дополнительным столбцом
- 15. Выполнять INSERT INTO с запросом
- 16. INSERT INTO using SELECT
- 17. delete from insert into statement
- 18. INSERT INTO ... SELECT в mysql
- 19. Как скопировать t2.col2 в t1.col3, где t1.col1 = t2.col1 в mysql?
- 20. Bulk Insert From Select
- 21. Помощь с INSERT INTO..SELECT
- 22. Как вставить пользовательские значения при выполнении INSERT INTO ... SELECT FROM
- 23. Различные SELECT для INSERT INTO
- 24. Как сделать INSERT SELECT INTO в Java с помощью PrepareStatement
- 25. Как сделать SELECT в INSERT?
- 26. Parse.com: Выполнение операций «SELECT FROM - INSERT INTO» в классах
- 27. ORACLE TRIGGER INSERT INTO ... (SELECT * ...)
- 28. INSERT INTO SELECT, не работает
- 29. INSERT INTO SELECT Смешивание языков
- 30. Более эффективно подключать T2 к T1, а не T1-T2, когда T1 имеет много T2 с условием, удерживаемым в T2? Или это то же самое?
вы могли бы предложить session.execute ('INSERT INTO t1 (% s)' % ул (sqlalchemy_select_expression))? – joeforker
Конечно, почему бы и нет - не нужно 'str()' хотя, так как '% s' уже делает это. – nosklo
Неужели это все еще невозможно? – Hadrien