Pandas read_sql 带占位符。 'Where cause' 一个错误
Pandas read_sql with placeholders. 'Where cause' an error
这里是 MS Access database,它包含一个 table。我想将它读入 DataFrame。这里的问题是什么时候
"WHERE" is used it causes 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
УУУ ΓΓΓ
啊解决了。这是我的解决方案:
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())
要回答您原来的问题,请尝试不带括号:
sql_str = '''SELECT Table1.* FROM Table1 WHERE Table1.Column01 = "DDD"'''
但是,如果您曾经使用过变量,最好使用占位符根据 WHERE
子句中的列类型来验证您的数据,并避免可能的 SQL 注入。祝你好运!
这里是 MS Access database,它包含一个 table。我想将它读入 DataFrame。这里的问题是什么时候 "WHERE" is used it causes 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
УУУ ΓΓΓ
啊解决了。这是我的解决方案:
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())
要回答您原来的问题,请尝试不带括号:
sql_str = '''SELECT Table1.* FROM Table1 WHERE Table1.Column01 = "DDD"'''
但是,如果您曾经使用过变量,最好使用占位符根据 WHERE
子句中的列类型来验证您的数据,并避免可能的 SQL 注入。祝你好运!