我在Python中通过SQLAlchemy实现了以下查询:
url = URL.create(
drivername="access+pyodbc",
query={
"odbc_connect": connStr,
},
)
with create_engine(url).connect() as con:
sql_get_anag = text(f"SELECT Tipo_Presenza FROM Presenza WHERE ID_Anagrafica = {IDValue} AND Giorno > {current_day_insert} AND Giorno < {current_day_insert_1}")
Presenza_tab = pd.read_sql_query(sql_get_anag, con)
这返回以下错误:
Exception has occurred: ProgrammingError
(pyodbc.ProgrammingError) ('42000', "[42000] [Microsoft][Driver ODBC Microsoft Access] Errore di sintassi (operatore mancante) nell'espressione della query 'ID_Anagrafica = 4 AND Giorno > 24-05-24 00:00:00 AND Giorno < 25-05-24 00:00:00'. (-3100) (SQLExecDirectW)")
[SQL: SELECT Tipo_Presenza FROM Presenza WHERE ID_Anagrafica = 4 AND Giorno > 24-05-24 00:00:00 AND Giorno < 25-05-24 00:00:00]
(Background on this error at: https://sqlalche.me/e/20/f405)
pyodbc.ProgrammingError: ('42000', "[42000] [Microsoft][Driver ODBC Microsoft Access] Errore di sintassi (operatore mancante) nell'espressione della query 'ID_Anagrafica = 4 AND Giorno > 24-05-24 00:00:00 AND Giorno < 25-05-24 00:00:00'. (-3100) (SQLExecDirectW)")
在我看来,where 条件的 Date 语法不正确,但我不知道正确的语法是什么。 您对这个问题有什么建议吗?
谢谢你
马里奥
我尝试添加和删除日期参数上的 ' 但没有成功。
我的期望是正确地进行选择查询
谢谢
首先,您不应该使用字符串格式化/插值将参数传递给查询。这对SQL注入是一个主要问题。人们通常给出的反驳是“我知道数据来自哪里”,并认为字符串格式化更容易。正如您所发现的那样,事实并非如此。 从来没有比参数化更容易的情况。
第二点,将查询包装在数据帧库中会使这些事情更难调试。因此,第一步是单独使用 SQL,然后将数据传递给
pandas
。
url = URL.create(
drivername="access+pyodbc",
query={"odbc_connect": connStr,}
)
with create_engine(url).connect() as conn:
query = text("""
SELECT
Tipo_Presenza
FROM
Presenza
WHERE
ID_Anagrafica = :id_value
AND Giorno > :current_day
AND Giorno < :current_day_1
"""
)
result = conn.execute(
query,
{
'id_value': IDValue,
'current_day': current_day_insert,
'current_day_1': current_day_insert_1
}
)
df = pd.DataFrame(result, columns=result.keys())
另外,我认为你真的不想像这样使用
create_engine
。您应该创建一次引擎,然后使用 with engine.connect() as conn
以避免每次建立引擎的开销。