SQLAlchemy에서 SELECT
문을 사용하여 테이블을 채우거나 업데이트하려면 어떻게합니까?SQLAlchemy에서 t1 (SELECT * FROM t2)에 어떻게 INSERT합니까?
답변
SQLalchemy는이 구문을 작성하지 않습니다. 텍스트의 쿼리를 사용할 수 있습니다.
session.execute('INSERT INTO t1 (SELECT * FROM t2)')
편집 :
이상 1 년 후,하지만 지금은 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)"
다른 편집 :
이제 4 년 후 SQLAlchemy 0.9에 구문이 통합되고 0.8.3으로 백 포트됩니다. 당신은 어떤 select()
를 만든 다음 Insert
객체의 새로운 from_select()
방법을 사용할 수 있습니다 :
>>> 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
More information in the docs합니다. 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. jQuery select from select
- 2. Oracle : select * from (select table_name from ...)?
- 3. SELECT * (ID와 별개) FROM
- 4. SQL INSERT from SELECT
- 5. 이 쿼리는 sqlalchemy에서 어떻게 표현합니까?
- 6. SELECT (* - some_columns) SQL의 FROM TABLE
- 7. Select * from TableName의 람다 식
- 8. SELECT 1 from DUAL : MySQL
- 9. MySQL select from PostgreSQL 변환
- 10. SELECT * FROM 테이블에서 FK를 해당 이름으로 바꿉니다.
- 11. 여러 SELECT 출력을 MySQL의 FROM 절에 어떻게 입력합니까?
- 12. Mysql : "select <fieldname> from"의 결과 순서가 "select * from"의 결과 순서와 다릅니다
- 13. MongoDB에 해당하는 NOT IN (SELECT * FROM X)
- 14. Select MAX (field) +1 FROM ... 동시성 문제
- 15. 엔티티에 LINQ에서 어떻게 내부가 FROM ... 쿼리의 유형 1 SELECT (EXISTS 할까?
- 16. sqlalchemy에서 잠그기
- 17. 성능 ('SQLNCLI', 원격 서버 설정, '고객 SELECT * FROM) OPENROWSET SELECT * FROM
- 18. sqlalchemy에서 해시로 결과를 인쇄합니다.
- 19. SELECT * FROM 테이블 WHERE col1 <= col2?
- 20. "SELECT * FROM users where IN()"== FAIL
- 21. select * from table_name '& nbsp'와 같은 열
- 22. SELECT 열 1 TABLENAME FROM 장고
- 23. select 문에서 from 절의 변수 사용
- 24. sql select from multiple postgres databases
- 25. mysql - select * from tableA, tableB - 문제
- 26. SQLAlchemy에서 '고급'쿼리를 실행하려고했지만 막혔습니다
- 27. SQLalchemy에서 왼쪽 조인에 대한 필터링
- 28. sqlalchemy에서 테이블 쿼리하기
- 29. psycopg2 register_composite from sqlalchemy
- 30. sqlalchemy에서 .sql 파일을 실행하십시오.
session.execute ('T1 INTO INSERT (% s의)'% str을 (sqlalchemy_select_expression))? – joeforker
물론, 왜 '% s'이 이미 그렇게했기 때문에'str()'이 필요하지는 않습니다. – nosklo
지금도 여전히 실행 가능하지 않습니까? – Hadrien