如何将PostgreSQL数据读取代码改写为OOP格式以获取国家名称列表
PostgreSQL数据库查询代码面向对象改写方案
完整可运行代码
import psycopg2 class CountryDBOperator: def __init__(self, host='localhost', database='Country Details', user='postgres', password='root'): # 初始化存储数据库连接参数 self.host = host self.database = database self.user = user self.password = password self.conn = None self.cur = None def _tuple_to_str_list(self, rows): """将查询返回的元组列表转换为字符串列表,对应原c_list函数""" return [row[0] for row in rows] def get_country_list(self): """连接数据库查询国家列表,对应原connect_db函数""" try: # 建立数据库连接 self.conn = psycopg2.connect( host=self.host, database=self.database, user=self.user, password=self.password ) self.cur = self.conn.cursor() # 执行查询语句 self.cur.execute("SELECT country_name FROM country_details") rows = self.cur.fetchall() # 转换格式后返回 return self._tuple_to_str_list(rows) except Exception as e: print(f"操作出现错误: {e}") return [] finally: # 释放资源,先关游标再关连接,修正原代码的顺序问题 if self.cur: self.cur.close() if self.conn: self.conn.close() # 调用示例 if __name__ == "__main__": db_operator = CountryDBOperator() countries = db_operator.get_country_list() print(countries)
改造说明
- 所有数据库相关逻辑都封装在
CountryDBOperator类中,符合面向对象封装的特性,后续新增其他查询需求直接在类内扩展方法即可,无需重复编写连接逻辑 - 类初始化支持自定义传入数据库连接参数,默认保留原代码的配置,适配不同环境的使用需求
- 私有方法
_tuple_to_str_list使用列表推导式简化了原代码的循环逻辑,功能完全一致 - 新增了异常捕获和资源自动释放逻辑,避免数据库操作异常时出现资源泄漏的问题
- 修正了原代码先关闭连接再关闭游标的错误顺序,符合psycopg2的资源释放规范
内容的提问来源于stack exchange,提问作者shailesh_07
相关产品推荐
相关产品推荐

