· 톺아보기

컴퓨터

python 잘하시는분 한번만 도와주세요. ㅠㅠ

바다와같은 ·

조회 4,014 · 공감 0 · 댓글 5

def make_greenplum_database_schema_table(yearmonth):

    # try:

    curs = greenplumdb.cursor()

    tablename = greenplum_database_name + '.' + str(greenplum_schemanameNo1 + '.' + str(yearmonth) )

    tablename = str(tablename)

    curs = greenplumdb.cursor()

    sql = """ 

        CREATE TABLE IF NOT EXISTS """ + str(tablename) + """ (

        field_name varchar NULL,

        field_date varchar NULL,

        field_time varchar NULL,

        field_cpu_usr varchar NULL,

        field_cpu_sys varchar NULL,

        field_cpu_idle varchar NULL,

        field_cpu_wai varchar NULL,

        field_cpu_hiq varchar NULL,

        field_cpu_siq varchar NULL,

        field_dsk_read varchar NULL,

        field_dsk_writ varchar NULL,

        field_net_recv varchar NULL,

        field_net_send varchar NULL,

        field_memory_used varchar NULL,

        field_memory_buff varchar NULL,

        field_memory_cach varchar NULL,

        field_memory_free varchar NULL

        ) ;"""

    print(sql)

    curs.execute(sql)

    greenplumdb.commit()


이렇게 짰는데, print 로 나온 sql 실행을 SQLclient(dbeaver)에서 실행하면 되는데, python 에서는 안되네요.. 주말 내내 빠져있는데...

머리 터질거 같아요.. ㅠㅠ







댓글 5

  1. 냠냠 · · 공감 1
    이런 류의 질문에는 언제나 에러메세지(=안 될 때의 실행결과)를 보여줘야 합니다. 스스로 해결할 때에는 그걸로 구글링 해보시는 게 맞구요.
  2. 바다와같은 ·
    Traceback (most recent call last):
    File "/Users/junhopark/OneDrive/GitHubSync/GPDB_log/main_06_postgre_04_temp.py", line 166, in <module>
    make_greenplum_database_schema_table(yearmonth)
    File "/Users/junhopark/OneDrive/GitHubSync/GPDB_log/main_06_postgre_04_temp.py", line 119, in make_greenplum_database_schema_table
    curs.execute(sql)
    psycopg2.errors.InFailedSqlTransaction: current transaction is aborted, commands ignored until end of transaction block
  3. 바다와같은 ·
    이런 메시지가나오는데, 검색해도 딱히 메시지가 안나와요서...ㅠㅠ 답답합니다.
  4. 진리의치맥 ·
    계정 정보는 어디서 가져오는지 한번 체크해보심이
  5. 예쁜닉네임 ·
    댓글 이미지
    파이썬 문제라기 보다는 데이터베이스 문제같네요. 해당 SQL 문이 SQLclient 에서는 실행된다고 하니, 그 SQL 문 말고 그 앞에 있는 어떤... 다른 SQL 문이 문제를 일으키는 것은 아닐까요?

    https://stackoverflow.com/questions/2209169/using-postgres-in-a-web-app-transaction-aborted-errors 의 대답에 왜 이런 일이 생기는지 설명하고 있네요. 이 대답에서 주목할만한 부분은... 우선 선행 에러가 있습니다. 예제로 든 것에서는...

    cur.execute('select current _date')

    current 와 _data 사이에 공백이 있습니다. 여기서 먼저 에러가 발생합니다. 그 다음, 에러가 발생하지 않을 것으로 보이는 SQL 문을 실행시킵니다.

    cur.execute('select current_date')

    여기서도 에러가 발생합니다. 이 때 발생하는 에러가...

    current transaction is aborted, commands ignored until end of transaction block

    라고 하네요. 이 에러가 왜 발생하는지 알려면 데이터베이스의 트랜젝션 이란 것을 조금 알아야 합니다. 위의 예제에서... 실패한 SQL 문을 철회하지 않았습니다. 실패했다면 철회해야 합니다. 성공했다면 완료시켜야 하고요. 이 예제에서는 롤백한 다음 SQL 문을 실행했습니다. try-except 형식을 하나 보여주고 있고요. 비슷한 내용인 https://stackoverflow.com/questions/2979369/databaseerror-current-transaction-is-aborted-commands-ignored-until-end-of-tra 에도 try-except 형식을 하나 보여주고 있네요.

    저는 앞쪽 것이 조금 더 좋아보입니다. 커서도 잘 닫아주고 있고요. 작성하신 코드에는 커서를 두 번 획득하고 있는데... 그럴 필요는 없을 것 같습니다. 뒷쪽 것에서 재미있는 것은... SQL 문을 실행시키기 전엔 롤백부터 하는 예제네요. 이것도 참고가 될 것 같아요.

아무거나질문 최근 글

아무거나질문 목록 더 보기