SQLAlchemy'de, bir tabloyu bir SELECT
deyiminden nasıl doldurabilir veya güncelleştirebilirim?SQLAlchemy'de t1 (SELECT * FROM t2) INSERT nasıl?
cevap
SQLalchemy bu yapıyı sizin için oluşturmuyor. Sorgu metnini kullanabilirsiniz.
session.execute('INSERT INTO t1 (SELECT * FROM t2)')
DÜZENLEME:
fazla bir yıl sonra, ama şimdi sqlalchemy 0.6+ you can create it tarih:
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
üretir:
"INSERT INTO mytable (SELECT mytable.x, mytable.y, mytable.z FROM mytable WHERE mytable.x > :x_1)"
Başka bir EDIT:
Şimdi, 4 yıl sonra sözdizimi SQLAlchemy 0.9'a dahil edildi ve 0.8.3'e geri döndü; Herhangi select()
oluşturmak ve sonra Insert
nesnelerin yeni from_select()
yöntemi kullanabilirsiniz:
>>> 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 yorumunda belirttiği gibi
, artık ham sql kurtulabilirsiniz: 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
üretir:
INSERT INTO mytable (SELECT mytable.x, mytable.y, mytable.z FROM mytable WHERE mytable.x > :x_1)
Artık kendi ClauseElement öğenizi oluşturmanız gerekmez. Yeni 'Insert.from_select' yöntemini kullanabilirsiniz! Cevabımı gör. – nosklo
0.8 itibariyle. 3, şimdi bunu doğrudan sqlalchemy'de yapabilirsiniz: Insert.from_select:
öneride misinizsel = select([table1.c.a, table1.c.b]).where(table1.c.c > 5)
ins = table2.insert().from_select(['a', 'b'], sel)
Teşekkürler. Bunu orijinal cevaba ekleyeceğim. – nosklo
- 1. Tuple <T1,T2> ve KeyValuePair arasındaki dönüşümler <T1, T2>
- 2. LINQ ile bir sözlük seçin <T1, T2>
- 3. SQL insert select @@ Kimlik
- 4. INSERT SELECT deyimi
- 5. MongoDB: select * from tablename
- 6. MYSQL INSERT SELECT sorunu
- 7. C# Func için Func <T1, object> dönüştürme <T1, T2>
- 8. Yansıma MemberInfo to Func <T1, T2>
- 9. t1.micro'dan t2.micro'ya geçiş yapın Amazon AWS
- 10. OPENQUERY SELECT ve INSERT için nasıl farklıdır?
- 11. SELECT sonuçlarına dayalı SQL INSERT
- 12. PostgreSql INSERT SELECT RETURNING ID
- 13. Linq: "from .. select" formunu kullanırken
- 14. SQL: INSERT INTO ... VALUES..SELECT
- 15. SELECT 1 from DUAL: MySQL
- 16. CursorIndexOutOfBoundsException: Dizin 0 istediğim, INSERT/SELECT
- 17. SQL SELECT Sorgu İLE INSERT INTIRING
- 18. SELECT sonuçları neden mysql ve sqlite arasında farklılık gösteriyor?
- 19. pg_dump vs KOPYA (SELECT * FROM my_table)
- 20. std :: function <R(T1,T2)> ile uyumlu işlev tipi kümesini belirleme kuralları?
- 21. linq - from from
- 22. Linq - İfade gelen İfade <T1> oluşturma <T2>
- 23. Rhino Mocks: Parametrelerimden biri Expression <Func<T1, T2>> olduğunda Stub() kullanabilir miyim?
- 24. Rails API'sı ile bir INSERT SELECT işlemini yapabilir miyim?
- 25. SELECT INTO SELECT - büyük miktarda kayıt
- 26. mysql SELECT NOT IN() - bağlantı kümesi mi?
- 27. MySQL Insert Select NOT NULL Constraint'ı Zorlama Yok
- 28. Oracle sql 11g - Bir nvl2 işlevi select deyimini içerebilir mi?
- 29. Daha hızlı olan: "SELECT * tablo" veya "SELECT x, y, q FROM tablosu" (4 alanlı bir tablodan)
- 30. insert (değerini seçin) birleştirmek
session.execute ('t1 INSERT INTO (% s)' % str (sqlalchemy_select_expression))? – joeforker
Elbette, neden olmasın - 'str()' işlevine gerek yok, çünkü '% s' zaten bunu yapıyor. – nosklo
Hâlâ uygun değil mi? – Hadrien