代码之家  ›  专栏  ›  技术社区  ›  joeforker

如何在sqlacalchemy中插入T1(从t2中选择*)?

  •  22
  • joeforker  · 技术社区  · 15 年前

    在SQLAlchemy中,如何从 SELECT 声明?

    3 回复  |  直到 7 年前
        1
  •  45
  •   nosklo    12 年前

    SQLAlchemy不会为您构建此构造。您可以使用文本查询。

    session.execute('INSERT INTO t1 (SELECT * FROM t2)')
    

    编辑:

    一年多过去了,但现在在sqlacalchemy 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年后,语法被合并到sqlacalchemy 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
    

    More information in the docs .

        2
  •  21
  •   Meow David Fraser    7 年前

    从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)
    
        3
  •  1
  •   Hadrien    14 年前

    正如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)