在SQLAlchemy中,如何填充或更新SELECT
語句中的表格?如何在SQLAlchemy中插入t1(SELECT * FROM t2)?
回答
SQLalchemy不會爲您構建此構造。您可以使用來自文本的查詢。
session.execute('INSERT INTO t1 (SELECT * FROM t2)')
編輯:
一年多過去了,但現在對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,並backported到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
由於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 SELECT「FROM t1,t2」 - 或者 - 「FROM t1 JOIN t2 ON」
- 2. 插入MySQL - 如果t1.count(*)<t2.available
- 3. 元組如何創建<T1,T2>。創建<T1,T2>(T1 item1,T2 item2)?
- 4. UPDATE TABLE T1 SET COLUMN = SELECT 0 FROM TABLE T1
- 5. sqlalchemy從SELECT中插入
- 6. TABLE1 T1,T2 TABLE2 WHERE T1.Blah = T2.Blah - VS - INNER JOIN
- 7. SQLAlchemy中插入來自case語句select查詢到FROM子句
- 8. Tuple之間的轉換<T1,T2>和KeyValuePair <T1, T2>
- 9. 從[] T1轉換爲[] T2時T2具有基礎類型T1的
- 10. 列安全的INSERT INTO t1 SELECT * FROM ...`
- 11. R:加入表格其中t1.key1 = t2.key1和t2.key2部分匹配t2.key2
- 12. 在postgresql中插入...值(SELECT ... FROM ...)?
- 13. 通過T2 []在T1 []中找到T1的有效方法其中T2 []是T1上的屬性?
- 14. SQL語句t1,t2等
- 15. 在Go中,如果T2類型基於T1類型,是否有任何類型的從T1到T2的「繼承」?
- 16. 如何將select(from db1)中的結果插入表(在db2中)
- 17. 當T1有多個T2且條件爲T2時,將T2連接到T1而不是T1到T2會更有效嗎?或者它是一樣的?
- 18. 通過t1.date加入不相關的表(在t2.startdate和t2.enddate之間)
- 19. 如何循環兩對STL集<pair<t1,t2>,對<t1,t2>>中的所有元素?
- 20. 如何使用矢量<T2>代替矢量<T1>,當T2是C++中T1的子類?
- 21. 如何在C++中模擬Func <T1,T2,TResult>?
- 22. 從2個表選擇時t1.id = t2.id和t1.name <> t2.name
- 23. 演員行動<T1>行動<T2>在c#中,其中T1和T2沒有關係
- 24. 驗證服務方法 - 「T2驗證<T1, T2>(表達式,T2)」vs「對象驗證<T1>(Expression,object)」
- 25. 填充柱通過連接T1和T2
- 26. 選擇字典<T1, T2> with LINQ
- 27. SQL Union 2表,如果在T2中發現重複,如何僅返回T1行,否則顯示T2行
- 28. SQLAlchemy的選擇從塔(SELECT FROM表列)
- 29. 如何在SQLAlchemy中使用UPDATE ... FROM?
- 30. sqlite的插入到表SELECT * FROM
您會建議session.execute( 'INSERT INTO T1(%S)' %STR(sqlalchemy_select_expression))? – joeforker
當然,爲什麼不 - 不需要'str()',因爲'%s'已經這樣做了。 – nosklo
現在還不行嗎? – Hadrien