postgresql.py 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. # -*- coding: utf-8 -*-
  2. import decimal
  3. # 设置语言环境
  4. import os
  5. import sys
  6. import json
  7. from datetime import datetime
  8. import log
  9. import importlib, sys
  10. importlib.reload(sys)
  11. os.environ['NLS_LANG'] = 'SIMPLIFIED CHINESE_CHINA.UTF8'
  12. import psycopg2
  13. class Postgresql:
  14. def __init__(self, conn):
  15. """Postgresql
  16. C:\Program Files\GeoScene\Pro\bin\Python\envs\arcgispro-py3\Scripts
  17. pip install psycopg2
  18. :param conn:数据库连接字符串('user/password@127.0.0.1/orcl')
  19. """
  20. # self._conn = psycopg2.connect(**conn, encoding="UTF-8", nencoding="UTF-8")
  21. self._conn = psycopg2.connect(**conn)
  22. self.cursor = self._conn.cursor() # 游标
  23. def commit(self):
  24. self._conn.commit()
  25. def close(self):
  26. try:
  27. if hasattr(self, 'cursor'):
  28. self.cursor.close()
  29. if hasattr(self, '_conn'):
  30. self._conn.close()
  31. except:
  32. msg = str(sys.exc_info()).decode('string-escape')
  33. log.error(msg)
  34. def __del__(self):
  35. self.close()
  36. def query(self, sql):
  37. """查询所有数据
  38. :param sql:SQL语句
  39. """
  40. self.cursor.execute(sql)
  41. ds = self.cursor.fetchall()
  42. cols = [d[0] for d in self.cursor.description]
  43. list = []
  44. for row in ds:
  45. b = dict(zip(cols, row))
  46. list.append(b)
  47. jobj = json.loads(json.dumps(list, cls=self.CustomJsonEncoder, ensure_ascii=False))
  48. return jobj
  49. class CustomJsonEncoder(json.JSONEncoder):
  50. """
  51. Json解析器,解决识别Decimal出错的问题
  52. """
  53. def default(self, obj):
  54. if isinstance(obj, datetime):
  55. return obj.strftime("%Y-%m-%d %H:%M:%S")
  56. if isinstance(obj, bytes):
  57. return str(obj, encoding='utf-8')
  58. if isinstance(obj, int):
  59. return int(obj)
  60. elif isinstance(obj, float):
  61. return float(obj)
  62. elif isinstance(obj, decimal.Decimal):
  63. return float(obj)
  64. # elif isinstance(obj, array):
  65. # return obj.tolist()
  66. else:
  67. return super(self.CustomJsonEncoder, self).default(obj)
  68. def insert(self, sql, dict=None):
  69. """查询数据
  70. :param sql:SQL语句 ==> insert into 表(字段1,字段2) values(:字段1,:字段2)
  71. :param dict:值字典 ==> {"字段1":"abc", "字段2":"abc"}
  72. """
  73. if dict == None:
  74. self.cursor.execute(sql)
  75. else:
  76. self.cursor.execute(sql, dict)
  77. self.commit()