如何在SQLAlchemy中插入t1(SELECT * FROM t2)?

时间:2009-12-04 20:12:58

标签: python sqlalchemy

在SQLAlchemy中,如何从SELECT语句填充或更新表?

3 个答案:

答案 0 :(得分:48)

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中,并向后移植到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 方法:

{{1}}

More information in the docs

答案 1 :(得分:23)

从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)

答案 2 :(得分: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)