SQLSoup(SQLAlchemyエクステンション)を使用して、SQL Server 2008データベースのレコードを更新しようとしています。私はpyobdcを接続に使用しています。関連する例を見つけることを困難にするいくつかの問題があります。ループ内のSQL Alchemyでレコードを更新する方法
非常に大きなテーブル(200万件以上のレコード)のジオメトリフィールドを再投影しているため、フィールドを更新する標準的な方法の多くは使用できません。ジオメトリフィールドからテキストに座標を抽出し、それらを変換して戻す必要があります。これはすべて問題なく、すべての個々の部分が機能しています。
しかし、レコードごとに1つずつループしながら、各行でSQL Updateステートメントを実行したいとします。私は、レコードセットにロックを置くか、接続が使用中であると仮定します。最初のレコードを正常に更新した後、下のコードを使用するかのように、接続が使用されています。
新しい接続を作成したり、既存の接続を再利用したり、別の方法でこれを達成する方法についてアドバイスをいただければ幸いです。
s = select([text("%s as fid" % id_field),
text("%s.STAsText() as wkt" % geom_field)],
from_obj=[feature_table])
rs = s.execute()
for row in rs:
new_wkt = ReprojectFeature(row.wkt)
update_value = "geometry :: STGeomFromText('%s',%s)" % (new_wkt, "3785")
update_sql = ("update %s set GEOM3785 = %s where %s = %i" %
(full_name, update_value, id_field, row.fid))
conn = db.connection()
conn.execute(update_sql)
conn.close() #or not - no effect..
更新された作業コードは次のようになります。それはいくつかのレコードでうまく動作しますが、テーブル全体がハングするので、あまりにも多くのデータを読み込んでいると思います。
db = SqlSoup(conn_string)
#create outer query
Session = sessionmaker(autoflush=False, bind=db.engine)
session = Session()
rs = session.execute(s)
for row in rs:
#create update sql...
session.execute(update_sql)
session.commit()
接続エラーが発生するようになりました。
これはODBCドライバに問題がある可能性がありように見えますDBAPIError: (Error) ('HY000', '[HY000] [Microsoft][ODBC SQL Server Driver]Connection is busy with results for another hstmt (0) (SQLExecDirectW)')
からhttp://sourceitsoftware.blogspot.com/2008/06/connection-is-busy-with-results-for.html
さらにを更新します。
プロファイラを使用して、サーバー上で、それは最初の更新ステートメントその後、select文を示してい「開始」しているが完了していない。 Select文を設定して上位10行を返すと、それは完了し、更新が実行されます。
SQL: Batch Starting Select...
SQL: Batch Starting Update...
私はこれがpyodbcとSQL Serverドライバの問題だと思っています。 SQL Alchemyを削除してpyodbcで同じSQLを実行すると、ハングすることもあります。更新のための新しい接続オブジェクトを作成したとしても。
また、MARS-Multiple Active Record Setsを許可することを目的としたSQL Server Native Client 10.0ドライバを試しましたが、違いはありませんでした。結局、私は "結果をページング"し、pyodbcとSQLを使ってこれらのバッチを更新していましたが(下記参照)、SQLAlchemyが自動的にこれを行うことができたと思いました。
は、なぜあなたは、単一のUPDATEステートメントとして、純粋なSQLでそれを書きませんか?私には見えます。 –
フィールドのonの内容は、SQL以外の独立した関数で処理する必要のあるバイナリオブジェクトです。なんらかの種類のカーソルが必要です。 – geographika
@geographikaこれまでのところ、あなたの投稿は5年前から投稿されました。 - 私はpyodbcとODBCドライバ11を使用してSqlサーバーへのSQL錬金術接続を介してノートブックでSQLマジックを使用しようとしています....しかし、正確に同じエラーメッセージを取得する – whytheq