微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

python – 通过创建模块简化数据库(psycopg2)的使用

让我先说一下我是Python的新手,如果这不适合这个问题,我会道歉.

我正在使用psycopg2模块来操作Postgresql数据库.一般用法看起来像这样:

# Example 1

import psycopg2

conn = psycopg2.connect(database="mydb", user="postgres")
cur = conn.cursor()

cur.execute ("SELECT * FROM mytable;")
rows = cur.fetchall()
for i, row in enumerate(rows):
    print "Row", i, "value = ", row

cur.close()
conn.close()

这将打开与mydb数据库的连接,从表mytable中选择所有字段并打印它们,然后关闭连接.

我想要做的是将这些功能中的一部分分解为一个模块,因为我需要在许多脚本中反复调用它们.对于这个例子,理想情况下我会有一个名为core的模块,它包含三个函数

> core.db_init() – 打开连接,由前面两行代码组成.
> core.db_query(query) – 执行所需的SQL查询,由上面代码中的第三行组成.
> core.db_close() – 关闭连接并由最后两行组成.

我尝试过如下创建模块:

# Module core.py

import psycopg2

def db_init():
    conn = psycopg2.connect(database="mydb", user="postgres")
    cur = conn.cursor()

def db_query(query):
    cur.execute(query)

def db_close():
    cur.close()
    conn.close()

但是当我尝试使用此模块重新创建示例1时,我得到名称空间错误

# Example 2

import core

core.db_init()
core.db_query("SELECT * FROM mytable;")

rows = cur.fetchall()
for i, row in enumerate(rows):
    print "Row", i, "value = ", row    

core.db_close()

我甚至不确定模块实际上是我想要的.我应该使用课吗?再说一遍,我对这一切都很陌生.但如果有人能帮助我找到更好的方法来做到这一点,我将非常感激.

解决方法:

您的主要问题是每个变量仅限于您编写的函数.
除非另有说明,否则:

def db_init():
    global conn
    conn = psycopg2....

更好的方法是将其转换为类,一个基本的例子是:

import psycopg2

class MyDatabase():
    def __init__(self, db="mydb", user="postgres"):
        self.conn = psycopg2.connect(database=db, user=user)
        self.cur = self.conn.cursor()

    def query(self, query):
        self.cur.execute(query)

    def close(self):
        self.cur.close()
        self.conn.close()

db = MyDatabase()
db.query("SELECT * FROM table;")
db.close()

现在,由于您使用的是cur.execute(),因此SELECT查询不会有太大作用.
但我保持这个目的是为了保持代码与你写的代码类似,你会想要交换它来返回值,但是如果调用一个预期返回值的查询等等.

您关注函数方法将具有“命名空间”问题,其中变量存在于该函数的本地范围内,而其他函数通常无法访问它们.

相反,类范围的变量可以访问它自己的变量,而不是开箱即用的限制.

您可以创建全局变量并在函数中将它们声明为全局变量,但我认为正如我在评论中提到的那样:

You’d want to make this into a class. A database is a session based entity just as classes are session entities. Handle each connection as a living entity by class-abstracting it, otherwise cur and conn will become scoped variables and you need to work them into the global scope.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐