>

그냥 PostgreSQL 와 프로젝트를 시작했다 . Excel에서 데이터베이스로 도약하고 싶습니다. 생성하고 삽입해야합니다. 일단 이것을 실행하면 업데이트로 전환해야하므로 현재 데이터를 계속 덮어 쓰지 않습니다. 연결이 작동하는 것을 알고 있지만 다음과 같은 오류가 발생합니다.

내 오류는 : TypeError: not all arguments converted during string formatting

#!/usr/bin/env python
import requests
import psycopg2
conn = psycopg2.connect(database='NHL', user='postgres', password='postgres', host='localhost', port='5432')
req = requests.get('http://www.nhl.com/stats/rest/skaters?isAggregate=false&reportType=basic&isGame=false&reportName=skatersummary&sort=[{%22property%22:%22playerName%22,%22direction%22:%22ASC%22},{%22property%22:%22goals%22,%22direction%22:%22DESC%22},{%22property%22:%22assists%22,%22direction%22:%22DESC%22}]&cayenneExp=gameTypeId=2%20and%20seasonId%3E=20172018%20and%20seasonId%3C=20172018') 
data = req.json()['data']
my_data = []
for item in data:
    season = item['seasonId']
    player = item['playerName']
    first_name = item['playerFirstName']
    last_Name = item['playerLastName']
    playerId = item['playerId']
    height = item['playerHeight']
    pos = item['playerPositionCode']
    handed = item['playerShootsCatches']
    city = item['playerBirthCity']
    country = item['playerBirthCountry']   
    state = item['playerBirthStateProvince']
    dob = item['playerBirthDate']
    draft_year = item['playerDraftYear']
    draft_round = item['playerDraftRoundNo']
    draft_overall = item['playerDraftOverallPickNo']
    my_data.append([playerId, player, first_name, last_Name, height, pos, handed, city, country, state, dob, draft_year, draft_round, draft_overall, season])
cur = conn.cursor()
cur.execute("CREATE TABLE t_skaters (data json);")
cur.executemany("INSERT INTO t_skaters VALUES (%s)", (my_data,))

data: 의 샘플

[[8468493, 'Ron Hainsey', 'Ron', 'Hainsey', 75, 'D', 'L', 'Bolton', 'USA', 'CT', '1981-03-24', 2000, 1, 13, 20172018], [8471339, 'Ryan Callahan', 'Ryan', 'Callahan', 70, 'R', 'R', 'Rochester', 'USA', 'NY', '1985-03-21', 2004, 4, 127, 20172018]]

  • 답변 # 1

    "data" 라는 하나의 열이있는 테이블을 생성하려는 것 같습니다 . 이 열의 유형은 JSON입니다. (필드 당 하나의 열을 만드는 것이 좋습니다. 그러나 그것은 당신에게 달려 있습니다.)

    이 경우 변수 data  (요청에서 읽은) list 입니다  와이즈 비츠 에스. 내 의견에서 언급했듯이 dict 를 반복 할 수 있습니다.   data 로 한 번에 하나씩 인서트를 수행하십시오.   executemany() 에 대한 여러 번의 호출보다 빠르지 않습니다. .

    내가 한 일은 다음과 같다 :

    <올>

    관심있는 필드 목록을 만드십시오.

    execute() 의 요소를 반복

    data 마다  와이즈 비즈 , 필드를 item 로 추출하십시오.

    와이즈 비즈에게 전화   data 에 전달  ( my_data 변환   execute() 에서  JSON 문자열로)

    이것을 시도하십시오 :

    json.dumps(my_data)
    
    

    모든 postgres 구문이 여기에 맞는지 100 % 확신 할 수는 없지만 (테스트 할 PG 데이터베이스에 액세스 할 수 없음)이 논리가 수행하려는 작업에 효과적이라고 생각합니다.

    별도의 열 업데이트

    여러 열을 처리하도록 create 문을 수정할 수 있지만 각 열의 데이터 유형을 알아야합니다. 수행 할 수있는 일부 유사 코드는 다음과 같습니다.

    my_data
    
    

    와이즈 비즈 교체  데이터에 적절한 값으로 설정하십시오.

    dict

  • 이전 두 가지 이상의 유형에 대한 Java 제네릭
  • 다음 json - 잘못된 작업 - 유형 인터페이스 {}이 (가) 인덱싱을 지원하지 않습니다