添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

# 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 에서는 안되네요.. 주말 내내 빠져있는데...

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

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 파이썬 문제라기 보다는 데이터베이스 문제같네요. 해당 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 문을 실행시키기 전엔 롤백부터 하는 예제네요. 이것도 참고가 될 것 같아요.