sqlalchemy 'SELECT * EN ## TempTable' receta falla al compilar con une literales

votos
0

para mi uso-caso particular necesito el:

SELECT * EN ## tmp DE some_table

constructo servidor SQL, y necesito la declaración totalmente compilado (con parámetros de línea incluidos) que se muestra a un ser humano en la línea de comandos antes de la instrucción es en realidad emite a la base de datos.

He utilizado el siguiente receta (ligeramente modificado para la sintaxis SQL Server): https://groups.google.com/forum/#!msg/sqlalchemy/O4M6srJYzk0/B8Umq9y08EoJ

y mientras que hace el trabajo, no puedo conseguirlo para visualizar los parámetros en línea.

Aquí está el código real:

from sqlalchemy.sql import Select, table, column
from sqlalchemy.ext.compiler import compiles

class SelectInto(Select):
    def __init__(self, columns, into, *arg, **kw):
        super(SelectInto, self).__init__(columns, *arg, **kw)
        self.into = into

@compiles(SelectInto)
def s_into(element, compiler, **kw):
    text = compiler.visit_select(element)
    text = text.replace('FROM', f'INTO {element.into} \nFROM')
    return text


employee = table('employee', column('id'), column('name'))
select_into = SelectInto([employee.c.id, employee.c.name], ##tmp).select_from(employee).where(employee.c.id.in_([1, 3, 6]))
print(select_into.compile(compile_kwargs={'literal_binds': True}).string)

Sin embargo, esto devuelve:

SELECT employee.id, employee.name 
INTO ##tmp 
FROM employee 
WHERE employee.id IN (:id_1, :id_2, :id_3)

más bien que:

SELECT employee.id, employee.name 
INTO ##tmp 
FROM employee 
WHERE employee.id IN (1, 3, 6)

He pasado tanto tiempo tratando de averiguar por qué y sólo tengo ni idea. Esta clase SelectInto subclases de la clase selecta sqlalchemy, y que la clase compila declaraciones con línea une literales sin ningún problema.

¿Por qué no funciona aquí?

Cualquier ayuda será muy apreciada

Publicado el 07/11/2018 a las 22:45
fuente por usuario
En otros idiomas...                            


1 respuestas

votos
0

Remitir los argumentos de palabra clave en su compilador personalizado:

@compiles(SelectInto)
def s_into(element, compiler, **kw):
    text = compiler.visit_select(element, **kw)
    text = text.replace('FROM', f'INTO {element.into} \nFROM')
    return text

Por el momento visit_select()no ve el literal_bindsargumento, por lo que el valor predeterminado es la compilación de marcadores de posición en su lugar.

Respondida el 08/11/2018 a las 04:32
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more