我最近注意到我们的产品的邮政编码位置(纬度和长坐标)不正确,用于许多“短”邮政编码 - 即“AB10”而不是“ABD 1PT”等。
邮政编码数据库/表格用于在谷歌地图上生成图钉,我现在已经知道,当我们将短邮政编码合并到包含完整邮政编码的表格时,有些(约2200)未正确输入经度和纬度错误的方式。
显然这是一个简单的修复,因此我决定编写一个小脚本来处理不正确的值(基本上是交换它们)。
这就是我所拥有的:
<cfscript>
/** Fetch the wrong postcodes data **/
db = "postcodes";
sql = "
SELECT
postcode, longitude, latitude
FROM
postcodes
WHERE
longitude > latitude
";
q = new Query(sql = trim(sql), datasource = db);
data = q.execute().getResult();
if (structKeyExists(form, "execute")) {
if (isQuery(data) && data.recordCount > 0) {
transaction action="begin"
{
try {
qUpdate = new Query(
datasource = db,
sql = "UPDATE postcodes SET longitude = :longitude, latitude = :latitude WHERE postcode = :postcode"
);
for (x = 1; x <= data.recordCount; x++) {
writeOutput("<p>" & data["postcode"][x] & "</p>");
qUpdate.addParam(name = "longitude", value = data["latitude"][x], cfsqltype = "CF_SQL_DOUBLE");
qUpdate.addParam(name = "latitude", value = data["longitude"][x], cfsqltype = "CF_SQL_DOUBLE");
qUpdate.addParam(name = "postcode", value = data["postcode"][x], cfsqltype = "CF_SQL_VARCHAR");
qUpdate.execute();
qUpdate.clearParams();
}
transactionCommit();
} catch (any e) {
transactionRollback();
writeOutput("<p>The database transaction failed, rolling back changes</p>");
writeDump(e);
}
}
writeOutput("#data.recordCount# postcodes have been updated");
} else {
writeOutput("There were no incorrect postcodes found in the database");
}
}
</cfscript>
<cfoutput>
<form name="update" action="" method="post">
<input type="hidden" name="execute" value="1"/>
<input type="submit" name="update" value="Update #val(data.recordCount)# Postcodes"/>
</form>
</cfoutput>
<!--- <cfdump var="#data#"/> --->
脚本包含在一个事务中,因为我计划在实时服务器上运行它,但是在本地测试脚本之后它继续运行了一个多小时!
邮政编码数据库包含近170万条记录,只有三列全部正确编入索引postcode, longitude, latitude
第一个查询返回正确的2,200条结果。
我已经检查过ColdFusion管理员中的组件缓存设置,看看我的本地是否缺少这个设置,但它已打开!
所以我的问题 - 为什么执行这么长时间?
我们正在使用mysql和ACF 9。
答案 0 :(得分:5)
为什么在CF中呢?只需在SQL中完成所有操作,它就会快得多。我不使用mysql,但有点像这样的东西:
UPDATE postcodes
SET longitude = newlongitude,
latitude = newlatitude
FROM (SELECT latitude AS newlongitude, longitude AS newlatitude FROM postcodes
WHERE longitude > latitude)
答案 1 :(得分:0)
执行这么长时间的原因可能是因为你在这个位上循环了2,200次:
writeOutput("<p>" & data["postcode"][x] & "</p>");
qUpdate.addParam(name = "longitude", value = data["latitude"][x], cfsqltype = "CF_SQL_DOUBLE");
qUpdate.addParam(name = "latitude", value = data["longitude"][x], cfsqltype = "CF_SQL_DOUBLE");
qUpdate.addParam(name = "postcode", value = data["postcode"][x], cfsqltype = "CF_SQL_VARCHAR");
qUpdate.execute();
qUpdate.clearParams();
使用SQL解决此问题,您将不会遇到此问题。