【发布时间】: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