본문 바로가기

DB엔지니어가 공부하는 python

[python_주소DB가지고놀기] 파이썬 으로 주소DB에 위도 경도 값 api로 받아 update 하기 #2

[python_주소DB가지고놀기] 파이썬 으로 주소DB에 위도 경도 값 api로 받아 update 하기 #2

 

안녕하세요.

 

지난번에 주소 DB를 공공데이터 포털에서 다운로드하여서 구축하는 작업을 했습니다.

 

## python_주소DB가지고놀기 1편 보러 가기

2020/01/17 - [DB엔지니어가 공부하는 python] - [python_주소DB가지고놀기]공공데이터포털 에서 주소DB 다운 받아 DB에 insert 하기 #1

 

[python_주소DB가지고놀기]공공데이터포털 에서 주소DB 다운 받아 DB에 insert 하기 #1

안녕하세요. 이번 작업은 제가 이미 여러 번 했던 작업이긴 한데.. 혹시나 필요하신 분들이 계실까 싶어 공유합니다. 우리나라 주소 DB를 내 DB에 구축하는 방법입니다. 1편은 파이썬과 직접적으로 관련 없습니다...

stricky.tistory.com

 

테이블 4개에 주소 데이터들이 잘 들어가 있을 텐데요.

 

아마 잘 따라 하신 분들은 데이터 건수도 확인하셨을 텐데, 주소 테이블이 지번 테이블보다 건수가 약 2백만 건 정도 적습니다.

 

일단 이 내용 머릿속에 기억해 두시고, 오늘 할 것은 구축한 주소 DB에 위도, 경도 값을 api로 받아서 update 하는 작업!

 

해보겠습니다.

 

아까 한번 말했듯이 주소 테이블이 가진 데이터가 지번 데이터보다 적습니다.

 

이것은 한 도로명주소가 1개 이상의 지번과 매핑이 된다고 봐도 되는 거겠죠. 그리고 일부 지번주소는 도로명주소가

 

매칭 되지 않는 경우도 있습니다. 현재 시스템상 그렇다고 합니다.

 

그래서 1개 이상의 지번주소와 매칭 되는 도로명주소는 그 지번주소 중 대표 주소를 찾아 1:1로 매칭을 해주어야 합니다.

 

위도 경도 API를 호출하기 위해서는 주소 full text가 필요합니다.

 

하지만 우리가 구축한 주소 DB에는 주소 full text가 없습니다.

 

만들어 줘야 합니다. 먼저 지번, 도로명 주소를 update 할 칼럼을 생성하겠습니다.

 

두 개의 칼럼을 juso_info_m(주소 테이블)에 추가하도록 하겠습니다.

# 지번주소값을 저장 할 컬럼
alter table schema_name.juso_info_m add inf_full_jb_addr varchar(300) null comment 'inf_지번주소';

# 도로명주소값을 저장 할 컬럼
alter table schema_name.juso_info_m add inf_full_road_addr varchar(300) null comment 'inf_도로명주소';

 

 

 

* 저는 mariadb를 쓴다는 점 참고하시기 바랍니다.

 

위와 같이 지번주소와 도로명 주소를 update 할 칼럼을 생성합니다.

 

그리고 주소 정보를 update 하는 sql문을 공유합니다.

 

-- # 도로명주소 update 문
update address_svc_m.juso_info_m ori
inner join
    (select
        CASE
            WHEN B.umd_nm IS NULL OR B.umd_nm = ''
                THEN CONCAT(B.sd_nm, ' ', B.sgg_nm, ' ', B.road_nm, ' ',
                            IF(A.build_sub_num = 0, A.build_main_num,
                               CONCAT(A.build_main_num, '-', A.build_sub_num)),
                            IF(D.multi_unit_yn = 1, IF(D.sgg_build_nm IS NULL OR D.sgg_build_nm = '', '',
                                                       CONCAT(' (', D.sgg_build_nm, ')')), ''))
            ELSE CONCAT(B.sd_nm, ' ', B.sgg_nm, ' ', B.road_nm, ' ',
                        IF(A.build_sub_num = 0, A.build_main_num,
                           CONCAT(A.build_main_num, '-', A.build_sub_num)), ', (',
                        B.umd_nm, IF(D.multi_unit_yn = 1, IF(D.sgg_build_nm IS NULL OR D.sgg_build_nm = '', '',
                                                             CONCAT(', ', D.sgg_build_nm)), ''), ')')
            END as road_addr,
            A.mgmt_num


FROM address_svc_m.juso_info_m A,
    address_svc_m.road_cd_info_m B,
    address_svc_m.add_info_m D
WHERE A.road_nm_cd = B.road_nm_cd
  AND A.umd_seq = B.umd_seq
  AND A.mgmt_num = D.mgmt_num) src
on ori.mgmt_num = src.mgmt_num

set ori.inf_full_road_addr_2 = src.road_addr
;


-- # 지번주소 update 문
update address_svc_m.juso_info_m ori
    inner join
    (SELECT CASE
                WHEN C.sgg_nm IS NULL OR C.sgg_nm = ''
                    THEN CONCAT(C.sd_nm, ' ', C.law_umd_nm, ' ',
                                IF(C.law_ri_nm IS NULL OR C.law_ri_nm = '', '', CONCAT(C.law_ri_nm, ' ')),
                                IF(C.san_yn = 0, '', '산 '),
                                IF(C.jb_sub_num = 0, C.jb_main_num, CONCAT(C.jb_main_num, '-', C.jb_sub_num)),
                                IF(D.multi_unit_yn = 1, IF(D.sgg_build_nm IS NULL OR D.sgg_build_nm = '', '',
                                                           CONCAT(' (', D.sgg_build_nm, ')')), ''))

                ELSE CONCAT(C.sd_nm, ' ', C.sgg_nm, ' ', C.law_umd_nm, ' ',
                            IF(C.law_ri_nm IS NULL OR C.law_ri_nm = '', '', CONCAT(C.law_ri_nm, ' ')),
                            IF(C.san_yn = 0, '', '산 '),
                            IF(C.jb_sub_num = 0, C.jb_main_num, CONCAT(C.jb_main_num, '-', C.jb_sub_num)),
                            IF(D.multi_unit_yn = 1,
                               IF(D.sgg_build_nm IS NULL OR D.sgg_build_nm = '', '', CONCAT(' (', D.sgg_build_nm, ')')),
                               ''))
                END as jb_addr,
            C.mgmt_num

     FROM address_svc_m.jibun_info_m C,
          address_svc_m.add_info_m D
     WHERE C.mgmt_num = D.mgmt_num
       AND C.main_yn = 1) src
    on ori.mgmt_num = src.mgmt_num

set ori.inf_full_jb_addr_2 = src.jb_addr
;

도로명주소와 지번주소 update 문입니다.

 

oracle과 mariadb 간에 조금 다른 문법이 있으니, 이 부분 잘 확인하시어 적용 바랍니다.

 

이렇게 까지 작업을 하면 주소 DB에 지번주소와 도로명 주소가 full text로 update 되었습니다.

#문의사항 있으시면 댓글을 남겨주시면 상세하게 안내드리겠습니다.

 

자, 이젠 이 주소 텍스트를 이용해서 각 주소별 위도, 경도 값을 api로 받아서 update 하는 걸 파이썬으로 처리하겠습니다.

 

주소별 위도, 경도 api는 구글맵, 카카오 맵, 네이버 클라우드 플랫폼 등등 에서 제공하고 있습니다.

 

그러나, 위에서 나열한 api들은 좀 제약이 있습니다. 네이버 클라우드 플랫폼이 그래도 좀 덜한 편이데..

 

전 아무도 잘 알려지지 않은 곳에서 api를 괜찮은걸 찾았습니다!! ㅎㅎ

 

여긴 계정당 하루 제한이 있으나, 계정을 많이 만들 수 있습니다.

 

나중에는 api 받아오는 파이썬 프로그램을 제 DB가 깔려있는 서버에 crontab을 걸어서 작업했는데도 거의 3주 정도 걸린 것 같습니다.

 

위도 경도받아오는 건 정말 시간과 끈기의 싸움입니다.

 

만약 구축하고 싶으시면 끈기 있게 도전하시기 바랍니다!!

 

제가 위도, 경도 api를 제공받은 곳은 아래와 같습니다.

http://www.vworld.kr/dev/v4dv_geocoderguide2_s001.do

 

공간정보 오픈플랫폼 오픈API

Geocoder API 2.0 레퍼런스 Geocoder API 2.0 레퍼런스입니다. API 버전 : Geocoder API 2.0 레퍼런스 Geocoder API 1.0 레퍼런스 소개 주소를 좌표로 변환하는 서비스를 제공합니다. 요청URL을 전송하면 지오코딩 서비스를 사용하실 수 있으며 일일 지오코딩 요청건수는 최대 30,000건 입니다. 단, API 요청은 실시간으로 사용하셔야 하며 별도의 저장장치나 데이터베이스에 저장할 수 없습니다. 주소정보를 좌표

www.vworld.kr

 

이곳에 접속하셔서 회원 가입하시고, Geocoder API 키를 발급받으시길 바랍니다.

 

키는 계정당 10개씩 발급받을 수 있으며, 키다 하루 3만 개의 API를 호출할 수 있습니다.

 

그럼 계정당 약 30만 개씩 하루에 받을 수 있고, 지도 데이터는 약 620여만 개이니, 산술적으로 약 21일 정도가 걸립니다.

 

제가 올려드릴 파이썬 코드를 crontab으로 스케줄 걸어서 사용하시면 빨리 할 수 있지 않을까 싶습니다.

 

참, api를 이용해서 호출하다 보면 exception 처리를 하기 위해서 inf_flag 칼럼이 하나 필요합니다.

 

이 칼럼을 주소테이블에 add 해 줍니다.

 

 

 

alter table schema_name.juso_info_m add inf_flag varchar(1) null comment 'inf_플래그';

이 플래그 칼럼을 통해서 아직 변환하지 않은 주소와, 한 주소, 에러가 난 주소를 구분 할 수 있습니다.

 

위 플래그 컬럼을 추가한 후 기본값으로 'N'을 update 해 줍니다.

UPDATE address_svc_m.juso_info_m SET inf_flag = 'N';

 

Geocoder API 호출하여 주소 DB에 update 하는 파이썬 코드는 아래와 같습니다.

 

import urllib.request
import urllib.parse
import pandas
import pymysql
import ast

#필요한 라이브러리들을 import 합니다.

# db connect 부분 입니다.
conn = pymysql.connect(host='XX.51.102.XXX',
                      user = 'user', password='password', db = 'address_svc_m',charset = 'utf8')

curs = conn.cursor(pymysql.cursors.DictCursor)

job_seq = 0

for time in range(0,2800):

    # key (mgmt_num) 과 full 도로명 주소를 쿼리 합니다.
    sql = "SELECT mgmt_num, inf_full_road_addr FROM address_svc_m.juso_info_m WHERE inf_flag = 'N' LIMIT 1"
    curs.execute(sql)
   
    #쿼리한 결과를 p_val에 저장
    p_val = curs.fetchall()
    
    #판다스에 저장 합니다.
    df = pandas.DataFrame(p_val, columns = ["mgmt_num","inf_full_road_addr"])

    p_mgmt_num = df.mgmt_num[0]
    inf_full_road_addr = df.inf_full_road_addr[0]

    # Geocoder API 2.0
    ApiKey = "발급받으신 Goecoder API의 key"
    
    address = inf_full_road_addr
    
    
    # API 호출 부분
    apiUrl = 'http://api.vworld.kr/req/address?service=address&request=getCoord&key='+ApiKey+'&'

    values = {
        'address':address,
        'type':'PARCEL'
    }

    param = urllib.parse.urlencode(values)
    Adding = apiUrl+param

    req = urllib.request.Request(Adding)
    res = urllib.request.urlopen(req)

    respon_data = res.read().decode()

    DataDict = ast.literal_eval(respon_data)

    v_check = DataDict['response']['status']
    
    # 위도, 경도값을 못찾은 경우를 대비해 못찾았으면 inf_flag에 'E'를 찍고 넘어감
    # 이렇게 처리 하지 않으면 프로그램이 돌다가 멈춰요..ㅠㅠ
    if v_check == 'NOT_FOUND' :
        sqlFail = "UPDATE address_svc_m.juso_info_m SET inf_flag = 'E' WHERE mgmt_num = %s"
        val = (p_mgmt_num)
        curs.execute(sqlFail,val)
        
        conn.commit()
    
    else :
        
        # 위도, 경도 데이터 받아서 update
        longtitude = DataDict['response']['result']['point']['x']
        latitude = DataDict['response']['result']['point']['y']
    
        sqlUpdate = "UPDATE address_svc_m.juso_info_m SET inf_flag = 'Y', inf_latitude = %s, inf_longtitude = %s WHERE mgmt_num = %s"
        val = (latitude,longtitude,p_mgmt_num)
        curs.execute(sqlUpdate,val)
    
    job_seq = job_seq + 1
    
    conn.commit()
        
    if job_seq%10 == 0 :
        conn.commit()
        print(job_seq)

print(job_seq)
conn.commit()

conn.close()

소스 안에 주석을 확인하시어 코드를 확인해 보세요.

 

아무래도 제가 만든 거다 보니 곳곳에 허점이 있을 수 있습니다.

 

그래도 이렇게 까지 한건 참... 개인적으론 뿌듯합니다.

 

전 위 소스를 아까도 말씀드렸다시피, ubuntu 서버에 올려서 crontab으로 스케쥴링해두고 update를 했습니다.

 

그러지 않고는 절대 할 수가 없었을 겁니다. 워낙 시간이 오래 걸리는 작업이라서요.

 

여러분들도 한번 필요하시다면 도전해 보시기 바랍니다.

 

오늘 주소 DB 가지고 놀기는 여기까지 입니다.

 

다음은 이걸로 뭘 해볼까요? ㅎㅎ

 

괜찮은 아이디어를 주시면 감사하겠습니다!

 

한주의 시작 월요일입니다. 활기차게 시작하세요!!

 

방문해 주시고, 읽어주셔서 감사합니다.

 

 

 

 

by.sTricky

  • Lee 2020.01.30 18:38

    안녕하세요^^ 주소 DB 관련 검색으로 글을 읽게 되었습니다.
    좋은 정보글 감사드립니다!!
    문의드릴것이 있어서 덧글 남겨요

    진행하신 내용 중에 제가 하고자 하는건 '전체 주소 full text 얻기'인데요,
    앞선 글대로 4개의 테이블에 데이터를 넣고, 지번주소와 도로명주소 full text를 업데이트 할 칼럼 생성 후,
    공유해주신 update 쿼리를 실행해보았습니다.

    두 가지 update 쿼리 중, 지번주소에 대한 쿼리문은 정상적으로 동작하여 성공적으로 지번주소가 업데이트 되었습니다
    하지만 도로명주소 update 쿼리는 아무런 결과를 얻을 수 없었습니다ㅠ

    SELECT 문만 따로 빼서 실행시켜보니까 결과가 아무것도 나오지 않아서, join을 하여도 의미 없는것 같아 보였습니다.
    WHERE문에서 다음과 같이 작성되어 있는데요,
    'WHERE A.road_nm_cd = B.road_nm_cd AND A.umd_seq = B.umd_seq ...'

    데이터를 확인하였을때 '읍면동일련번호'가 주소 DB와 도로명코드 DB가 각각 숫자와
    텍스트인데 이것 때문에 아닐까 생각되는데...
    기존에 진행하실 때, 다른 작업이 들어갔는지 아니면 의심가는 부분 조언해주시면 감사드리겠습니다ㅠ!!

    • Favicon of https://stricky.tistory.com nice sTricky 2020.01.30 18:42 신고

      제가 오늘 퇴근했거든요..
      내일 오전에 확인후 댓글 달겠습니다!
      감사합니다!

    • Favicon of https://stricky.tistory.com nice sTricky 2020.01.31 09:56 신고

      안녕하세요.
      출근하자마자 확인하고 댓글 씁니다!

      우선 제가 블로그에 올린거랑 제 DB에 create 생성문 확인해보니 umd_seq 는 모두 varchar로 되어 있습니다.

      각각 숫자와 텍스트는 아닌것으로 보이구요.(제가 올려드린데로 생성했다면..)

      혹시라도 수정하시는중 바뀌었을수 있을것 같아서 int와 varchar 간에 join이 잘 되는지 확인을 해봤더니, 잘 되구요.

      create table address_svc_m.join1 (a varchar(10),b varchar(10));
      create table address_svc_m.join2 (a int(10),b int(10));

      insert into address_svc_m.join1 values ('1','10');
      insert into address_svc_m.join1 values ('2','20');
      insert into address_svc_m.join2 values (1,10);
      insert into address_svc_m.join2 values (2,20);

      select * from address_svc_m.join1 a, address_svc_m.join2 b
      where a.a = b.a

      혹시 DBMS를 뭘 쓰시는지 알수 있을까요?

      더불이 지번은 잘 업데이트가 되는데, 도로명주소가 잘 안되는것은 도로명코드 테이블에 데이터가 잘 적재되어 있는지 확인이 필요 할 것으로 보입니다.

      알려주신 내용으론 이정도까지 추론이 가능 할 것 같습니다..

      한번 확인 다시 해보시고, 다시 문의 주세요! 감사합니다.

      좋은하루 되세요!

    • Lee 2020.01.31 10:37

      안녕하세요 댓글 감사드립니다ㅠ!!

      사용하는 DBMS는 MariaDB를 사용중입니다.

      말씀드린 내용중에, '읍면동일련번호'를 나타내는 컬럼인 'umd_seq'이 각각 테이블에서 실제 값이 달라서 where 조건문에서 매칭이 안되는건가? 싶어서 문의드렸어요!! (제가 db 쪽은 자세히 몰라서...)

      도로명주소 테이블의 'umd_seq' 값: 01, 02...
      도로명코드 테이블의 'umd_seq' 값: 세종, 삼일, 필운, ...

      (공유해주신 create 생성문 대로 둘다 varchar 타입이에요)

      우선 말씀주신대로 테이블에 데이터가 제대로 적재되었는지는 확인해보는것이 좋을 것 같네요

      감사합니다!!

      ---------------------------

      제가 도로명코드 테이블에 들어간 데이터를 확인중인데,

      road_nm_cd(도로명코드) | umd_seq(읍면동일련번호) | road_nm(도로명) | road_roma_nm(도로명로마자) ...
      111102005001 | 세종 | Sejong-daero | 02

      이런식으로 들어가있네요;;
      이 값이 올바르게 들어가지 않은것으로 보여서 바꿔서 넣어보고 다시 시도해보겠습니다!!

    • Favicon of https://stricky.tistory.com nice sTricky 2020.01.31 11:10 신고

      아이고!
      도로명코드에 값이 잘못들어가 있네요.
      아래 제가 올려드리는 LOAD DATA 문을 참고해서 다시 넣어보세요. 도로명코드 테이블만 테이블 컬럼 순서랑 다운받으신 도로명코드 데이터 들어있는 텍스트파일의 순서가 좀 다릅니다.
      확인하시어 다시 데이터 넣어보세요.
      도로명코드 umd_seq에도 숫자가 들어가야 합니다. 그래야 join이 되겠죠!




      LOAD DATA LOCAL INFILE '/home/mariadb/201912update_juso/utf8_개선_도로명코드_변경분.txt'
      REPLACE
      INTO TABLE address_svc_m.road_cd_info_month
      FIELDS TERMINATED BY '|'
      OPTIONALLY ENCLOSED BY ''
      LINES TERMINATED BY '\n'
      (@road_nm_cd,
      @road_nm,
      @road_roma_nm,
      @umd_seq,
      @sd_nm,
      @sd_roma_nm,
      @sgg_nm,
      @sgg_roma_nm,
      @umd_nm,
      @umd_roma_nm,
      @umd_gb,
      @umd_cd,
      @use_yn,
      @update_rs_cd,
      @update_his_info,
      @anncmt_date,
      @erase_date)
      SET
      road_nm_cd = @road_nm_cd,
      umd_seq = @umd_seq,
      road_nm = @road_nm,
      road_roma_nm = @road_roma_nm,
      sd_nm = @sd_nm,
      sd_roma_nm = @sd_roma_nm,
      sgg_nm = @sgg_nm,
      sgg_roma_nm = @sgg_roma_nm,
      umd_nm = @umd_nm,
      umd_roma_nm = @umd_roma_nm,
      umd_gb = @umd_gb,
      umd_cd = @umd_cd,
      use_yn = @use_yn,
      update_rs_cd = @update_rs_cd,
      update_his_info = @update_his_info,
      anncmt_date = @anncmt_date,
      erase_date = @erase_date
      ;

    • Lee 2020.01.31 11:13

      앗 방금 제 댓글 수정했는데 댓글 달아주셨네요!!

      말씀해주신대로 도로명코드 테이블 컬럼 순서랑 텍스트 파일 순서랑 다르네요;;

      감사합니다~!!

    • Favicon of https://stricky.tistory.com nice sTricky 2020.01.31 11:25 신고

      네, 제가 미쳐 그것까지 블로그에 기재하지 못하였네요!
      모쪼록 잘 작업이 되시길 바랍니다!
      감사합니다!

  • Gine 2020.03.06 15:27

    안녕하세요... 질문이 있어서 댓글 남겨요~ 앞에서 공공데이터를 전부 마리아 디비 안에 넣고 이번 주소DB에 위도 경도 값 api로 받아 update 하기를 하고 있습니다. 그 앞에서 full text 만들어 주기를 하는데 있어서 alter를 이용해서 shcema_name이라는 데이터베이스의 juso_info_m안에 새로운 컬럼을 추가하라는 것 까지 이해 하였습니다.

    그러데 그 밑에 보면 update를 하는데 address_svc_m이라는 데이터베이스안에 juso_info_m ori를 뭐 조인 해라 이런식인거 같은데... 저거 새로운 데이터베이스를 만들어서 그 안에 앞서 했던 바와같이 새로운 테이블을 만들어서 해야하는건가요??
    그리고 그 안에 address_svc.juso_info_m A 와 B 그리고 D도 새롭게 만들어야 하나요... ㅠㅠ 너무 많은 질문을한거 같아서 죄송합니다. 부디 알려주세요,,,

    • Favicon of https://stricky.tistory.com nice sTricky 2020.03.06 15:42 신고

      아하! 안녕하세요.
      아마.. DB쪽을 완벽하게 이해하신분 같지는 않으신것 같습니다. schema_name 이라고 제가 명시 했던건 원하시는 schema이름을 쓰라는 말씀이였습니다. 만약 지금 schema_name 이라는 스키마를 생성하고 그 아래 juso_info_m이라는 테이블을 만드신거라면, 아래에 address_svc_m 대신 그 schema_name을 그대로 쓰시면 됩니다. 저 같은 경우 스키마 이름을 address_svc_m으로 했기때문에 다른 sql 쿼리를 보면 address_svc_m이라고 나와있는겁니다. 그리고, 테이블명 뒤에 ori, A,B,C,D 뭐 이런건 alias 라고 합니다. 테이블 명이 길기 때문에 조인을 하는 sql에서 테이블명 대신 쓰는 별칭 같은겁니다.

      흠.. 이걸 이렇게 설명 드려도 좀 어려우실것 같은데... 만약 지금 이미 만들어두신 스키마명이 schema_name 이라면 update 할때 address_svc_m 대신 schema_name을 넣으시면 될 것 같아요! 또 잘 안되시면 댓글 주세요!

    • Gine 2020.03.06 17:42

      아 정말 감사합니다 이해 했습니다.
      그냥 처음부터 다시 데이터베이스를 address_svc_m 과같은 형태로 만들어서 실습을 진행하고 있습니다. 지금 full text만들어주는 곳에서

      SQL 오류 (1054): Unknown column 'ori.inf_full_road_addr_2 in 'field list'
      이러한 형태의 오류가 뜨고...있습니다.
      위에서 ori.inf_full_road_addr는 새롭게 생성하였고... ori.inf_full_road_addr_2는 생성하지 않아도 위에서 설명하신 alias와 같은 형태로 만들어진다면 위와 같은 에러가 왜 뜨는지 모르겠네요ㅜㅜ 새롭게 칼럼을 더 만들어야 하나요??

    • Favicon of https://stricky.tistory.com nice sTricky 2020.03.06 17:53 신고

      일단, 잘 되신다니 다행입니다! 해당 쿼리를 올려주세요. 그럼 정확하게 대답 해드릴수 있을것 같습니다.

    • Gine 2020.03.06 18:05

      아아 그 저는 선생님께서 하신 그대로 타이핑하고 있습니다.... 그래서 full text를 만들기 위해서 update문에서 마지막줄
      set
      ori.inf_full_road_addr_2 =src.road_addr ;
      에서
      SQL 오류 (1054): Unknown column 'ori.inf_full_road_addr_2 in 'field list'

      이러한 에러가 떠서
      ori_inf_full_road_addr_2를 ori_inf_full_road_addr로 바꾸었더니 실행이 되었습니다. 이렇게 계속 실습을 진행해도 될까요??

    • Favicon of https://stricky.tistory.com nice sTricky 2020.03.06 18:07 신고

      아하! 네 맞습니다ㅎㅎ

    • Gine 2020.03.06 20:51

      또 질문해서 죄송합니다ㅠㅠ
      pymysql을 이용해서 key (mgmt_num) 과 full 도로명 주소를 쿼리 하려고하는데
      sql = "SELECT mgmt_num, inf_full_road_addr FROM address_svc_m.juso_info_m WHERE inf_flag = 'N' LIMIT 1"
      curs.execute(sql) 부분에서
      (1054, "Unknown column 'inf_full_road_addr' in 'field list'")
      이러한 에러가 발생합니다...
      아나콘다 에서 새로운 가상환경 생성했고 쥬피터 노트북으로 사용하고 있습니다.
      위의 select~~ LIMIT 1 부분까지 쿼리 날리면 잘 동작하는데 쥬피터 노트북에서는 없는 필드라고 나오네요... 데이터 베이스상에는 존재하고 있는데 말이죠.
      호스트 포트 유저 등등 전부 잘 적어서 연결되어 있습니다.. 뭐가 문제일까요...

    • Favicon of https://stricky.tistory.com nice sTricky 2020.03.06 21:07 신고

      어허.. 그냥 이렇게 봐서는 별다른 문제가 생길수 없을것 같은데.. 음.. 다른 쿼리를 한번 넣어보시죠. 다른 구문에 문제가 있는건지.. 아니면.. from절에 테이블명 앞에 스키마명 붙여보세요

  • 2020.03.11 09:40

    비밀댓글입니다

    • Favicon of https://stricky.tistory.com nice sTricky 2020.03.11 10:04 신고

      브라우져에 url 넣으시면 위도 경도 다 뜨나요? 읽히지 않는다는건.. 에러가 난다는 말씀이신가요? 아니면 DB에 값이 안들어온다는것 인가요? 어느단에서 데이터가 유실되는지 봐야 알수있을것 같은데요.