我正在尝试使用 SQLSoup - SQLAlchemy 扩展来更新 SQL Server 2008 数据库中的记录。我正在使用 pyobdc 进行连接。有许多问题使得很难找到相关的例子。
我在一个非常大的表(200 万+条记录)中重新投影几何字段,因此无法使用许多更新字段的标准方法。我需要从几何字段中提取坐标到文本,将它们转换并传回。这一切都很好,所有单独的部分都在工作。
但是我想在每一行上执行一个 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()
我现在收到连接繁忙错误。
DBAPIError: (Error) ('HY000', '[HY000] [Microsoft][ODBC SQL Server Driver]Connection is busy with results for another hstmt (0) (SQLExecDirectW)')
看起来这可能是 ODBC 驱动程序的问题 - http://sourceitsoftware.blogspot.com/2008/06/connection-is-busy-with-results-for.html
进一步更新:
在使用探查器的服务器上,它显示 select 语句,然后第一个 update 语句正在“开始”,但都不完整。如果我将 Select 语句设置为返回前 10 行,那么它会完成并运行更新。
SQL: Batch Starting Select...
SQL: Batch Starting Update...
我相信这是pyodbc和 SQL Server 驱动程序的问题。如果我删除 SQL Alchemy 并使用 pyodbc 执行相同的 SQL,它也会挂起。即使我为更新创建了一个新的连接对象。
我还尝试了 SQL Server Native Client 10.0 驱动程序,该驱动程序旨在允许 MARS -多个活动记录集,但它没有任何区别。最后,我求助于“分页结果”并使用 pyodbc 和 SQL 更新这些批次(见下文),但是我认为 SQLAlchemy 可以自动为我完成此操作。