SqlAlchemy 选择日期条件

问题描述 投票:0回答:1

我在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 语法不正确,但我不知道正确的语法是什么。 您对这个问题有什么建议吗?

谢谢你

马里奥

我尝试添加和删除日期参数上的 ' 但没有成功。

我的期望是正确地进行选择查询

谢谢

python ms-access sqlalchemy pyodbc
1个回答
0
投票

首先,您不应该使用字符串格式化/插值将参数传递给查询。这对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
以避免每次建立引擎的开销。

© www.soinside.com 2019 - 2024. All rights reserved.