【问题标题】:Python looping to obtain different dataframes from a SQL databasePython循环从SQL数据库中获取不同的数据帧
【发布时间】:2021-08-05 13:38:08
【问题描述】:

我正在尝试连接到 SQL 数据库,并在一个循环中为每个不同的 Id 实例创建单独的数据框,其中包含与该 Id 相关的所有数据。我已经尝试了很多方法,到目前为止都没有成功。我对这一切都很陌生,所以我可能会犯一些新手错误。

尝试 1:

import pandas as pd
import pyodbc

conn = pyodbc.connect('Driver={SQL Server};'
                      'Server=Server_name;'
                      'Database=Database;'
                      'UID=Username;'
                      'PWD=password;'
                      'Trusted_Connection=yes;')

Name = ['HR','ZA','PR','FW']

for x in Name:
    
    SQL = '''
        SELECT *
        FROM Database
        WHERE Id = {x}'''.format(x = x)
    cursor = conn.cursor()
    cursor.execute(SQL)
    df = pd.read_sql_query(SQL)

在此代码中,第一个名称“HL”出现“无效列名”编程错误。

尝试 2:

import pandas as pd
import pyodbc

conn = pyodbc.connect('Driver={SQL Server};'
                      'Server=Server_name;'
                      'Database=Database;'
                      'UID=Username;'
                      'PWD=password;'
                      'Trusted_Connection=yes;')

    SQL = '''
        SELECT *
        FROM Database
    
conn.autocommit = True

cursor.execute(SQL)

for [Id] in cursor:
    df = pd.Dataframe(SQL,conn)
        

在这段代码中,我在 for 语句中收到“ValueError: too many values to unpack (expected 1)”。

我想在 for 循环中添加更多代码,因此我需要将其设置为通过每个 Id 工作。我希望这是有道理的。任何指导将不胜感激。谢谢

更新:

感谢所有 cmets/答案。由于某种原因,我无法让它以上述任何一种格式工作,所以我把它带回了我从现在开始的地方,我了解如何包含循环变量的语法。现在可以使用以下方法:

import pandas as pd
import pyodbc

conn = pyodbc.connect('Driver={SQL Server};'
                          'Server=Server_name;'
                          'Database=Database;'
                          'UID=Username;'
                          'PWD=password;'
                          'Trusted_Connection=yes;')
    
Name = ['HR','ZA','PR','FW']

for x in Name:

    SQL = pd.read_sql_query(
    '''
    SELECT *
    FROM Database_table
    WHERE Id = '{x}'
    '''.format(x = x), conn)

    df = pd.DataFrame(SQL)
    

【问题讨论】:

  • WHERE Id = {x} 更改为WHERE Id = '{x}' 是否为您的尝试1 解决了这个问题?
  • 另外,我建议使用sqlalchemy 作为您的数据库的接口,它得到很好的支持,如果您的数据库交互变得更加复杂,它将对您有用
  • 感谢@YaakovBressler - 如果我这样做,我会收到不同的错误消息 - TypeError: read_sql_query() missing 1 required positional argument: 'con'
  • 这很奇怪。你唯一改变的是字符串格式?
  • 感谢您的指导 - 我已经开始工作了 - 见上文

标签: python pandas loops pyodbc


【解决方案1】:

我认为,如果您在第一次尝试时尝试变体,例如:

for x in Name:

    SQL = '''
          SELECT *
          FROM Database
          WHERE Id = ?'''
    cursor = conn.cursor()
    cursor.execute(SQL)
    df = pd.read_sql_query(SQL, params={x})

它应该可以工作:)

【讨论】:

  • 谢谢。如果我改变它,我会收到以下消息(这可能是一个单独的问题?) - 错误:('07002','[07002] [Microsoft][ODBC SQL Server Driver]COUNT 字段不正确或语法错误(0) (SQLExecDirectW)')
  • 嗯,很有趣。 Database 是数据库名还是数据库表名?
  • Conn 中引用的Database 是数据库名称,而SQL 中引用的Database 是数据库表。对不起,我应该在我的总结代码中更清楚地说明这一点。感谢您的所有帮助和指导。正如您在上面看到的,我已经成功了 - 谢谢
  • 很高兴听到:)
猜你喜欢
  • 2016-01-18
  • 1970-01-01
  • 1970-01-01
  • 2013-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-14
相关资源
最近更新 更多