使用循环将pyodbc.Rows附加到数据框中

时间:2018-01-08 16:46:08

标签: python sql pandas pyodbc

我正在尝试将一些数据从sql server导入python。我想逐行导入数据并迭代地将其附加到数据帧。

到目前为止我的代码是:

data_NS = pd.DataFrame(columns=Fields_NS)
i=0

while(i < 10):
    row = cursor.fetchone()
    rowAsList = list(row)
    data_NS.append(rowAsList)
    i = i+1
conn.close()

data_NS的结果是空数据帧。 我没有收到任何错误消息,因此我们将非常感谢任何信息。

2 个答案:

答案 0 :(得分:1)

您的DataFrame保持为空,因为DataFrame.append

  

在此框架的末尾附加其他行,返回新对象

(强调我的。)所以干脆做

data_NS.append(...)

将采用现有的data_NS帧,向其添加内容,并将结果作为新帧返回,然后将其丢弃,因为它未分配给变量。

我认为您实际上正在尝试做更多类似的事情:

fields_NS = ["id", "txt"]
data_NS = pd.DataFrame(columns=fields_NS)

sql = """\
SELECT 1 AS id, 'foo' as txt
UNION ALL
SELECT 2 AS id, 'bar' as txt
"""
crsr.execute(sql)

i = 0
while i < 10:
    row = crsr.fetchone()
    if not row:
        break
    row_as_dict = dict(zip(fields_NS, row))
    data_NS = data_NS.append(row_as_dict, ignore_index=True)
    i += 1

但请注意,这种逐行追加可能会相当慢。

答案 1 :(得分:0)

我会这样试试:

connection = pyodbc.connect('your server information')
query = 'SELECT TOP 100 * FROM table'
df = pd.read_sql_query(query, connection)

为避免内存错误,只需调整查询并仅选择所需的列,或根据您查询的数据库类型使用“TOP”或类似内容调整返回的行数。