"SELECT INTO #temptable" is a SQL server specific trick that just
creates #temptable on the fly.   SQL standard is INSERT from SELECT.
Since you're looking to dynamically create tmptbl, this implies that
there needs to be a table() object generated given the set of columns
from the original table.    While "SELECT INTO" is a SQL server trick
that creates the table on the fly, this doesn't help us because we
don't get back a "tmptbl" object with columns.   So there's not much
point in using it.

So we go to the recipe I already gave you on the issue you posted:
https://bitbucket.org/zzzeek/sqlalchemy/issues/4148/feature-request-mssql-select-into#comment-41933692

you'd like the columns to be dynamic.  OK, here's that:

from sqlalchemy import *
from sqlalchemy.sql import quoted_name
from sqlalchemy.orm import Session
from sqlalchemy.ext.declarative import declarative_base


def select_into(name, query):
    temp_table = Table(
        quoted_name(name, quote=False),
        MetaData(),
        *[Column(attr['name'], attr['type']) for attr
          in query.column_descriptions]
    )
    conn = query.session.connection()
    temp_table.create(conn)
    conn.execute(temp_table.insert().from_select(
        [attr['name'] for attr in query.column_descriptions], query.statement
    ))

    return temp_table


Base = declarative_base()


class A(Base):
    __tablename__ = 'a'
    id = Column(Integer, primary_key=True)
    x = Column(Integer)
    y = Column(Integer)

e = create_engine("mssql+pymssql://scott:tiger^5HHH@mssql2017/test", echo=True)
Base.metadata.drop_all(e)
Base.metadata.create_all(e)

s = Session(e)

s.add_all([A(x=1, y=2), A(x=2, y=3)])
s.commit()

q = s.query(A.x, A.y)

tmp_table = select_into("#temp", q)

subqu1 = s.query(tmp_table).filter(tmp_table.c.x == A.x).exists()
print s.query(A).filter(subqu1).all()


output:

CREATE TABLE #temp (
    x INTEGER NULL,
    y INTEGER NULL
)


INSERT INTO #temp (x, y) SELECT a.x, a.y
FROM a
SELECT a.id AS a_id, a.x AS a_x, a.y AS a_y
FROM a
WHERE EXISTS (SELECT 1
FROM #temp
WHERE #temp.x = a.x)






On Sat, Dec 16, 2017 at 3:47 AM, Евгений Рымарев
<rymarev.eug...@gmail.com> wrote:
> Hello!
> How i can create something like that:
> SELECT column
> INTO #tmptbl
> FROM table
>
> SELECT *
> FROM table2 t2
> WHERE EXISTS(SELECT 1
>              FROM #tmptbl
>              WHERE column = t2.column)
>
> in SQLAlchemy I imagine it like this:
> tmptbl = session.query(table.c.column).into('#tmptbl')
> subqu1 = session.query(tmptbl).filter(tmptbl.c.column ==
> table2.c.column).exists()
> result = session.query(table2).filter(subqu1)
>
> --
> SQLAlchemy -
> The Python SQL Toolkit and Object Relational Mapper
>
> http://www.sqlalchemy.org/
>
> To post example code, please provide an MCVE: Minimal, Complete, and
> Verifiable Example. See http://stackoverflow.com/help/mcve for a full
> description.
> ---
> You received this message because you are subscribed to the Google Groups
> "sqlalchemy" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to sqlalchemy+unsubscr...@googlegroups.com.
> To post to this group, send email to sqlalchemy@googlegroups.com.
> Visit this group at https://groups.google.com/group/sqlalchemy.
> For more options, visit https://groups.google.com/d/optout.

-- 
SQLAlchemy - 
The Python SQL Toolkit and Object Relational Mapper

http://www.sqlalchemy.org/

To post example code, please provide an MCVE: Minimal, Complete, and Verifiable 
Example.  See  http://stackoverflow.com/help/mcve for a full description.
--- 
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to sqlalchemy+unsubscr...@googlegroups.com.
To post to this group, send email to sqlalchemy@googlegroups.com.
Visit this group at https://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.

Reply via email to