2016-04-09 36 views
0

Birkaç bin adresi saklayan bir MySQL tablom var. Bunları coğrafi konum API'sına ayırmam, enlem ve boylamı al ve onları karşılık gelen adres satırına koymam gerekiyor (bunun için özel sütunlar yaptım). Soru, bunu yapmanın en etkili yolu nedir? Şu anda mysql.connector ile python ve geolocations için geopy kullanıyorum. Böylece ben coğrafi kodlama için kullanmak basit bir koddur:MySQL tablasını yineleme ve güncelleştirme

cursor = conn.cursor() 

cursor.execute("SELECT description FROM contacts WHERE kind = 'Home adress'") 

    row = cursor.fetchone() 
    while row is not None: 
     geocoded = geolocator.geocode(row, exactly_one=True) 
     if geocoded is not None: 
      lat = geocoded.latitude 
      lon = geocoded.longitude 
     row = cursor.fetchone() 

Ben biraz yeniyim SQL Veritabanları, bu yüzden herhangi bir yardım mutluluk duyacağız. Şimdiden teşekkürler.

+0

Açıklama alanı benzersiz olmadıkça tablonuz için birincil anahtara ihtiyacınız olacak, böylece tabloyu verimli bir şekilde güncelleyebilirsiniz. Sen de var mı? – mhawke

+0

Evet, key_id sütunum var. –

cevap

1

Tabloyu tek seferde güncellemek için cursor.executemany()'u kullanabilirsiniz. Bu, daha sonra executemany()'a geçirilebilecek bir güncelleme parametreleri listesinin oluşturulmasını gerektirir. Parametre listesi, ilk SELECT sorgusunun sonuçlarından oluşturulabilir. Bu yukarıda belirtildiği gibi

cursor = conn.cursor() 
cursor.execute("SELECT key_id, description FROM contacts WHERE kind = 'Home adress'") 

update_params = [] 
for key_id, description in cursor: 
    geocoded = geolocator.geocode(description, exactly_one=True) 
    if geocoded is not None: 
     lat = geocoded.latitude 
     lon = geocoded.longitude 
     update_params.append((lat, lon, key_id)) 

c.executemany("update contacts set lat = %s, lon = %s where key_id = %s", update_params) 

birincil anahtarının varlığını varsayar: Örnekte ben contacts tablo için key_id adında bir birincil anahtar olduğunu varsaydım aşağıda. Eğer bir tane yoksa description tablodaki benzersiz bir alan ise bunu kullanabilirsiniz. Sadece, SELECT sorgudan kaldırın ve listesi ve update sorgu için key_id alanı description alanı ile değiştirin.

+0

Birincil anahtar sütun adı olarak 'key_id' kullanmak üzere güncellendi. – mhawke

1

@mhavke, çok teşekkürler! Tam ihtiyacım olan şey. İşte sonunda çalışan bir kod (bazı ayarlamalar yaptım). Ayrıca, '% s' kullanarak güvensiz olduğunu, ancak bunun yalnızca dahili kullanım için geçerli olduğunu, dolayısıyla gerçekten endişelenmediğinin farkındayım.

cursor = conn.cursor() 
cursor.execute("SELECT key_id, description FROM contacts WHERE kind = 'Home address'") 
update_params = [] 
for key_id, description in cursor: 
    geocoded = geolocator.geocode(description, exactly_one=True) 
    if geocoded is not None: 
     lat = geocoded.latitude 
     lon = geocoded.longitude 
     update_params.append((lat, lon, key_id)) 

cursor.executemany("update contacts set latitude = %s, longitude = %s where key_id = %s", update_params) 
conn.commit() 
+0

'% s' bu durumda güvenlidir - string enterpolasyonu değil, parametreli bir sorgudur. Bu mysql.connector için doğru yer tutucudur - benim örneğim '' ', çünkü test ettiğim sqlite3' tarafından kullanılır. Cevabımı buna göre güncelledim. – mhawke

+0

BTW, girintiniz yanlış. – mhawke

+0

sadece yanlış yazılmış, düzenlenmiş. –

İlgili konular