使用python变量使用sqlalchemy从访问表中读取特定行

发布于 2025-01-29 21:03:51 字数 470 浏览 1 评论 0原文

我有一个名为“ cell_list”的访问表,其中一个称为“ cell_#”的键列。我想将表读取到数据框中,但只有匹配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)

但是无论我尝试什么,我都会得到语法错误。 我该怎么做?

I have an access table called "Cell_list" with a key column called "Cell_#". I want to read the table into a dataframe, but only the rows that match indices which are specified in a python list "cell_numbers".
I tried several variations on:

   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)

But no matter what I try I get a syntax error.
How do I do this?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

☆獨立☆ 2025-02-05 21:03:51

考虑在

# 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)

qmarks = [', '.join('?' for _ in cell_numbers)]
query = (
    'SELECT * FROM Cell_list '
    f'WHERE [Cell_#] IN ({qmarks})'
)

Consider best practice of parameterization which is supported in 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)

Consider even dynamic qmark placeholders dependent on length of cell_numbers:

qmarks = [', '.join('?' for _ in cell_numbers)]
query = (
    'SELECT * FROM Cell_list '
    f'WHERE [Cell_#] IN ({qmarks})'
)
拥抱没勇气 2025-02-05 21:03:51

转换(JOIN)cell_numbers转换为文本:

cell_text = '(1,3,7)'

并加入此。

完成的SQL应该读取(您可能需要围绕怪异字段名称单元格_#):

SELECT * FROM Cell_list WHERE [Cell_#] IN (1,3,7)

Convert (join) cell_numbers to text:

cell_text = '(1,3,7)'

and concatenate this.

The finished SQL should read (you may need brackets around the weird field name Cell_#):

SELECT * FROM Cell_list WHERE [Cell_#] IN (1,3,7)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文