Запрос переменной Pyodbc

1

Я пытаюсь сделать запрос с переменными, но строковые переменные не работают. Как следует форматировать переменные PrimaryAxis и SecondaryAxis в запросе? Я использовал ссылку из https://github.com/mkleehammer/pyodbc/wiki/Getting-started#parameters. На странице используются одиночные кавычки. Я пробовал одиночные и двойные кавычки без везения.

import pyodbc

# Connect to database
conn_str = (
    r'DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};'
    r'DBQ=C:\Temp\TestDB.accdb;'
    r'Uid=;'
    r'Pwd=;'
    )

# Make cursor
connection = pyodbc.connect(conn_str)
connection.setencoding('utf-8')
cursor = connection.cursor()

# Create test table
cursor.execute("CREATE TABLE Coordinates (ID integer, X integer, Y integer)")
connection.commit()

# Create test data (Error "Missing semicolon (;)" if multiple values in one insert, thats why multiple insertions... not the main question)
cursor.execute("INSERT INTO Coordinates (ID, X, Y) VALUES (1,10,10);")
cursor.execute("INSERT INTO Coordinates (ID, X, Y) VALUES (2,20,10);")
cursor.execute("INSERT INTO Coordinates (ID, X, Y) VALUES (3,30,10);")
connection.commit()

# Filter parameters
Line = 10
Start = 10
End = 30

# Works
cursor.execute(r"""
                SELECT *
                FROM Coordinates
                WHERE Y = ? AND X BETWEEN ? AND ? """, Line, Start, End )

rows = cursor.fetchall()
for row in rows:
    print(row)

# does not work - main question
PrimaryAxis = 'X'
SecondaryAxis = 'Y'

cursor.execute(r"""
                SELECT *
                FROM Coordinates
                WHERE ? = ? AND ? BETWEEN ? AND ? """, SecondaryAxis, Line, PrimaryAxis, Start, End )

rows = cursor.fetchall()
for row in rows:
    print(row)
Теги:
ms-access
pyodbc

1 ответ

0

Вы можете просто использовать форматирование строк:

# Filter parameters
line = 10
start = 10
end = 30
primary_axis = "X"
secondary_axis = "Y"
query = """
        SELECT *
        FROM Coordinates
        WHERE {col1} = {val1} AND {col2} BETWEEN {start} AND {end}
        """.format(col1=secondary_axis, val1=line, col2=primary_axis, start=start, 
                   end=end)
cursor.execute(query)
... 
  • 0
    это не хорошее решение из-за инъекции SQL ...
  • 0
    @ Спасибо за это. Я обновил решение, чтобы предотвратить атаку на основе bobby-tables.com/python.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню