0

私は Pyodbc を使用して sqlserver に接続し、いくつかの行を取得しています。私が実行する選択クエリは、メモリの問題を引き起こす約 200,000 行をフェッチします。

この問題を解決するには、ジェネレータ オブジェクトを使用して、任意の時点で 5000 行をフェッチします。

この種の実行の問題は、ジェネレータ オブジェクトです。データ列名を失います..

たとえば、table1 に列 NAME がある場合、通常の実行により、結果セットに result.NAME としてアクセスできます。

しかし、ジェネレーターオブジェクトで同じことを行うことはできません..列名からアクセスすることはできません。

入力は役に立ちますか?

4

1 に答える 1

2

を使用Cursor.fetchmany()してクエリ結果をバッチで処理すると、pyodbc.Rowオブジェクトのリストが返され、列名による参照が可能になります。

データベース名を 5 つのバッチで返す SQL Server クエリの例を次に示します。

発電機なし

connection = pyodbc.connect(driver='{SQL Server Native Client 11.0}',
                            server='localhost', database='master',
                            trusted_connection='yes')
sql = 'select name from sys.databases'
cursor = connection.cursor().execute(sql)
while True:
    rows = cursor.fetchmany(5)
    if not rows:
        break
    for row in rows:
        print row.name

ジェネレーター付き (ここのサンプルから変更)

def rows(cursor, size=5):
    while True:
        rows = cursor.fetchmany(size)
        if not rows:
            break
        for row in rows:
            yield row 

connection = pyodbc.connect(driver='{SQL Server Native Client 11.0}',
                            server='localhost', database='master',
                            trusted_connection='yes')
sql = 'select name from sys.databases'
cursor = connection.cursor().execute(sql)
for row in rows(cursor):
    print row.name
于 2013-04-17T15:48:53.527 に答える