【问题标题】:Pandas read_sql with placeholders. 'Where cause' an error带有占位符的 Pandas read_sql。 'Where cause' 错误
【发布时间】:2018-02-01 08:59:51
【问题描述】:

这是 MS Access database,它包含一个表。我想将它读入DataFrame。这里的问题是什么时候 使用“WHERE”会导致 pyodbc.Error: ('07002', '[07002] [Microsoft][ODBC Microsoft Access Driver] 参数太少。预期 1. (-3010) (SQLExecDirectW)

import pyodbc #conda install -c anaconda pyodbc
import pandas as pd
import os
db_path=os.path.realpath("test01.accdb")
conn_str = (
    r"DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};"
    f"DBQ={db_path};"
    )

#sql_str='''SELECT Table1.* FROM Table1''' # << this one works    
sql_str='''SELECT Table1.* FROM Table1 WHERE (((Table1.Column01)="DDD"))''' # << this one doesn't work

with pyodbc.connect(conn_str) as conn:    
    df=pd.read_sql(sql_str, conn)
print(df.head())

数据库:
Column01 Column02
AAA BBB
CCC DDD
УУУ ГГГ

【问题讨论】:

  • 我认为它不会改变任何东西,但您可以尝试不带括号的相同查询:sql_str='SELECT Table1.* FROM Table1 WHERE Table1.Column01="DDD"'

标签: python sql pandas ms-access pyodbc


【解决方案1】:

啊解决了。这是我的解决方案:

import pyodbc #conda install -c anaconda pyodbc
import pandas as pd
import os
db_path=os.path.realpath("test01.accdb")
conn_str = (
    r"DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};"
    f"DBQ={db_path};"
    )
sql_str='''SELECT Table1.* FROM Table1 WHERE Table1.Column01=?'''

with pyodbc.connect(conn_str) as conn:    
    df=pd.read_sql(sql_str, conn, params=("CCC",))
print(df.head())

【讨论】:

    【解决方案2】:

    要回答您的原始问题,请尝试不带括号:

    sql_str = '''SELECT Table1.* FROM Table1 WHERE Table1.Column01 = "DDD"'''
    

    但是,如果您曾经使用过变量,最好使用占位符来根据 WHERE 子句中的列类型验证您的数据,并避免可能的 SQL 注入。祝你好运!

    【讨论】:

    • 是否使用占位符取决于“DDD”是否为用户提供的数据。如果它是静态文字,则不需要占位符。不过,使用 ANSI 标准文字是一种很好的做法:在 SQL 中,文字字符串使用单引号。双引号表示标识符。上面的查询应该会产生一个错误:no such column: DDD.
    猜你喜欢
    • 1970-01-01
    • 2015-04-28
    • 2017-02-14
    • 2014-08-16
    • 1970-01-01
    • 1970-01-01
    • 2011-06-26
    • 2016-07-05
    相关资源
    最近更新 更多