使用 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})'
)