¿Cómo puedo seleccionar el lugar donde en los valores con tuplas en Python sqlite3?

jmkjaer:

Tengo una base de datos SQLite con tres columnas, y yo estoy tratando de utilizar la sustitución de parámetros para tuplas a SELECTfilas. Esta es mi mesa;

conn = sqlite3.connect("SomeDb.sqlite3")

conn.execute("""
CREATE TABLE RoadSegmentDistribution(
    Source INTEGER,
    Destination INTEGER,
    Distribution TEXT
)
""")

Yo sé cómo sustituir con los no-tuplas, pero no puedo encontrar la manera de hacerlo con tuplas.

En base a esta respuesta , pensé que simplemente tenía que sustituir todos y cada valor a través de la lista de tuplas:

for e in conn.execute("""
    SELECT *
    FROM RoadSegmentDistribution
    WHERE (
        Source, Destination
    ) IN (VALUES (?,?), (?,?), (?,?), (?,?), (?,?))
    """,
    [(1, 2),(2, 3),(4, 5),(6, 7),(8, 9)]
):
    print(e)

pero luego me sale el error

ProgrammingError: Número incorrecto de fijaciones suministradas. El estado de cuenta actual utiliza 10, y hay 5 suministrado.

Obviamente, significa esto que sólo necesita un signo de interrogación por tupla, ¿no ?:

for e in conn.execute("""
    SELECT *
    FROM RoadSegmentDistribution
    WHERE (
        Source, Destination
    ) IN (VALUES (?), (?), (?), (?), (?))
    """,
    [(1, 2),(2, 3),(4, 5),(6, 7),(8, 9)]
):
    print(e)

Pero entonces me sale este error:

OperationalError: rendimientos sub-select 1 columnas - 2 esperada

No se puede insertar manualmente los valores como en la respuesta vinculado, ya que no sé cuál es el parámetro de lista contiene. Esto significa que tengo que hacer algún tipo de ",".join()función de la longitud de la lista, pero voy a darse cuenta de eso una vez que sepa cómo hacer la sustitución con una lista de longitud fija.

¿Cómo puedo hacer esto?

blhsing:

Utilizando el str.joinmétodo es de hecho una buena manera de lograr esto, dada la falta de soporte nativo para los marcadores de posición a base de contenedores en motores SQL:

values = [(1, 2), (2, 3), (4, 5), (6, 7), (8, 9)]

for e in conn.execute(f"""
    SELECT *
    FROM RoadSegmentDistribution
    WHERE (
        Source, Destination
    ) IN (VALUES {','.join(f'({",".join("?" * len(t))})' for t in values)})
    """,
    [i for t in values for i in t]
):
    print(e)

donde, con la propuesta values:

f"""
    SELECT *
    FROM RoadSegmentDistribution
    WHERE (
        Source, Destination
    ) IN (VALUES {','.join(f'({",".join("?" * len(t))})' for t in values)})
"""

ampliaría en:

SELECT *
FROM RoadSegmentDistribution
WHERE (
    Source, Destination
) IN (VALUES (?,?),(?,?),(?,?),(?,?),(?,?))

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=285118&siteId=1
Recomendado
Clasificación