使用 python 变量使用 sqlalchemy 从访问 table 中读取特定行
use python variable to read specific rows from access table using sqlalchemy
我有一个名为“Cell_list”的访问权限 table,其中有一个名为“Cell_#”的键列。我想将 table 读入数据框,但只有与 python 列表“cell_numbers”中指定的索引匹配的行。
我尝试了几种变体:
import pyodbc
import pandas as pd
cell_numbers = [1,3,7]
cnn_str = r'Driver={Microsoft Access Driver (*.mdb,*.accdb)};DBQ=C:\folder\myfile.accdb;'
conn = pyodbc.connect(cnn_str)
query = ('SELECT * FROM Cell_list WHERE Cell_# in '+tuple(cell_numbers))
df = pd.read_sql(query, conn)
但无论我尝试什么,我都会遇到语法错误。
我该怎么做?
将cell_numbers
转换(加入)为文本:
cell_text = '(1,3,7)'
并连接这个。
完成的 SQL 应该是这样的(您可能需要在奇怪的字段名称 Cell_#
周围加上括号):
SELECT * FROM Cell_list WHERE [Cell_#] IN (1,3,7)
考虑 pandas.read_sql
支持的参数化最佳实践:
# PREPARED STATEMENT, NO DATA
query = (
'SELECT * FROM Cell_list '
'WHERE [Cell_#] IN (?, ?, ?)'
)
# RUN SQL WITH BINDED PARAMS
df = pd.read_sql(query, conn, params=cell_numbers)
甚至考虑动态 qmark 占位符取决于 cell_numbers
的长度:
qmarks = [', '.join('?' for _ in cell_numbers)]
query = (
'SELECT * FROM Cell_list '
f'WHERE [Cell_#] IN ({qmarks})'
)
我有一个名为“Cell_list”的访问权限 table,其中有一个名为“Cell_#”的键列。我想将 table 读入数据框,但只有与 python 列表“cell_numbers”中指定的索引匹配的行。 我尝试了几种变体:
import pyodbc
import pandas as pd
cell_numbers = [1,3,7]
cnn_str = r'Driver={Microsoft Access Driver (*.mdb,*.accdb)};DBQ=C:\folder\myfile.accdb;'
conn = pyodbc.connect(cnn_str)
query = ('SELECT * FROM Cell_list WHERE Cell_# in '+tuple(cell_numbers))
df = pd.read_sql(query, conn)
但无论我尝试什么,我都会遇到语法错误。 我该怎么做?
将cell_numbers
转换(加入)为文本:
cell_text = '(1,3,7)'
并连接这个。
完成的 SQL 应该是这样的(您可能需要在奇怪的字段名称 Cell_#
周围加上括号):
SELECT * FROM Cell_list WHERE [Cell_#] IN (1,3,7)
考虑 pandas.read_sql
支持的参数化最佳实践:
# PREPARED STATEMENT, NO DATA
query = (
'SELECT * FROM Cell_list '
'WHERE [Cell_#] IN (?, ?, ?)'
)
# RUN SQL WITH BINDED PARAMS
df = pd.read_sql(query, conn, params=cell_numbers)
甚至考虑动态 qmark 占位符取决于 cell_numbers
的长度:
qmarks = [', '.join('?' for _ in cell_numbers)]
query = (
'SELECT * FROM Cell_list '
f'WHERE [Cell_#] IN ({qmarks})'
)