Trong SQLAlchemy, làm cách nào để điền hoặc cập nhật bảng từ câu lệnh SELECT
?Làm cách nào để INSERT INTO t1 (SELECT * FROM t2) trong SQLAlchemy?
Trả lời
SQLalchemy không xây dựng cấu trúc này cho bạn. Bạn có thể sử dụng truy vấn từ văn bản.
session.execute('INSERT INTO t1 (SELECT * FROM t2)')
EDIT:
Hơn một năm sau đó, nhưng bây giờ trên 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
Tạo:
"INSERT INTO mytable (SELECT mytable.x, mytable.y, mytable.z FROM mytable WHERE mytable.x > :x_1)"
Một EDIT khác:
Bây giờ, 4 năm sau, cú pháp được kết hợp trong SQLAlchemy 0.9 và được chuyển thành 0.8.3; Bạn có thể tạo ra bất kỳ select()
và sau đó sử dụng phương pháp mới from_select()
của Insert
đối tượng:
>>> 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
Như Noslko chỉ ra trong bình luận, bạn bây giờ có thể thoát khỏi sql liệu: 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
Tạo:
INSERT INTO mytable (SELECT mytable.x, mytable.y, mytable.z FROM mytable WHERE mytable.x > :x_1)
Bây giờ bạn không phải tạo khoản riêng của mình. Bạn có thể sử dụng phương thức 'Insert.from_select' mới! Xem câu trả lời của tôi. – nosklo
Tính đến 0,8. 3, bây giờ bạn có thể làm điều này trực tiếp trong 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)
Cảm ơn. Tôi sẽ thêm nó vào câu trả lời gốc. – nosklo
- 1. Làm thế nào để làm "INSERT INTO table1 (...) SELECT (...) FROM table2" trong LINQ?
- 2. Tự động khớp các cột trong INSERT INTO ... CHỌN ... TỪ
- 3. INSERT INTO SELECT - số lượng lớn hồ sơ
- 4. INSERT vs INSERT INTO
- 5. INSERT INTO ... SELECT cho tất cả các cột MySQL
- 6. SQL INSERT INTO với SELECT và INNER JOIN
- 7. Thực hiện lệnh INSERT INTO ... SELECT với LINQ to SQL
- 8. Tính chất kiểu C++ để chọn giữa T1 và T2
- 9. INSERT INTO với subquery MySQL
- 10. Chọn từ điển <T1, T2> với LINQ
- 11. Làm cách nào để viết SELECT FROM myTable WHERE id IN (SELECT ...) trong LINQ?
- 12. Làm thế nào để thêm giá trị tĩnh khi thực hiện INSERT INTO với SELECT trong truy vấn MySQL?
- 13. SQL Server SELECT INTO @variable?
- 14. Tránh các bản sao ở INSERT INTO truy vấn SELECT trong SQL Server
- 15. Làm thế nào để chọn giá trị ngưỡng T1 và T2 cho cụm Canopy?
- 16. MySQL INSERT INTO ... GIÁ TRỊ VÀ CHỌN
- 17. Phản ánh MemberInfo tới Func <T1, T2>
- 18. MySQL Làm thế nào để bạn INSERT INTO một bảng với truy vấn con SELECT trả về nhiều hàng?
- 19. chèn sqlite vào bảng select * from
- 20. Kết hợp INSERT INTO và WITH/CTE
- 21. MySQL Làm cách nào để truy xuất ID của LAST_INSERT_ID khi sử dụng INSERT IGNORE INTO?
- 22. INSERT INTO/SELECT DISTINCT dẫn đến vi phạm khóa chính cho SYS_GUID
- 23. INSERT INTO Bảng từ nhiều bảng
- 24. SELECT INTO với hơn một thuộc tính
- 25. Làm thế nào để kiểm soát nullability trong SELECT INTO cho cột đen dựa trên
- 26. MySQL INSERT với nhiều SELECT lồng nhau
- 27. SELECT .. INTO để tạo một bảng trong PL/pgSQL
- 28. MySQL INSERT INTO bảng GIÁ TRỊ .. so với bảng INSERT INTO SET
- 29. Làm việc của std :: map <t1, t2> :: xóa (vị trí lặp)?
- 30. Làm cách nào để nhận được nhiều giá trị cao nhất từ một bảng?
Bạn có đề xuất session.execute ('INSERT INTO t1 (% s)'% str (sqlalchemy_select_expression)) không? – joeforker
Chắc chắn, tại sao không - không cần 'str()' mặc dù, vì '% s' đã làm điều đó. – nosklo
Bây giờ vẫn không thể thực hiện được? – Hadrien