首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >跨python文件的psycopg2

跨python文件的psycopg2
EN

Stack Overflow用户
提问于 2014-07-28 13:28:53
回答 1查看 1K关注 0票数 1

我正在编写一个Python应用程序(基于控制台),它使用PostgreSQL数据库(通过psycopg2)和R(通过rpy)。它是一个基于过程的大型应用程序,涉及多个步骤,有时重复步骤,并不总是涉及所有步骤。

我有以下几点:

代码语言:javascript
复制
main_file.py

modules/__init__.py
modules/module1.py
modules/module2.py

functions/__init__.py
functions/function1.py
functions/function2.py

init文件只表示导入module1、module2或function1,function2取决于它是哪个init文件。

main_file.py的内容如下所示:

代码语言:javascript
复制
import modules
from functions import function1

class myClass():
    def my_function(self):
         scripts = [
                    # modules.module1.function, 
                    modules.module2.function, 
                   ]

         print "Welcome to the program."

         function1.connect()

         for i in scripts:
            i

         cur.close()

         print "End of program"

if __name__ == '__main__':
     myClass().my_function()

如果不需要的话,循环的原因是注释掉某些步骤。我试图调用的connect()函数是psycopg2连接。它看起来如下(在函数1.py文件中):

代码语言:javascript
复制
import sys
import psycopg2

def connect():
    try:
        con = psycopg2.connect(database=dbname, user=dbuser)
        cur = con.cursor()
        db = cur.execute
    except psycopg2.DatabaseError, e:
        if con:
             con.rollback()
        print e
        sys.exit

在main_file.py示例中,我试图运行module2,它需要连接到数据库,使用如下所示:

代码语言:javascript
复制
def function:
    db("SELECT * INTO new_table FROM old_table")
    con.commit()

如何让Python (2.7)识别全局名称db、cur和con?因此,通过程序中的所有步骤连接到数据库并保持活动连接?

EN

回答 1

Stack Overflow用户

发布于 2014-07-28 14:32:54

您应该向模块中添加一个函数,该模块初始化将返回创建的DB对象的DB,然后拥有每个想要使用DB调用该函数的模块:

函数1.py

代码语言:javascript
复制
import sys
import psycopg2

con = cur = db = None

def connect():
    global con, cur, db
    try:
        con = psycopg2.connect(database=dbname, user=dbuser)
        cur = con.cursor()
        db = cur.execute
    except psycopg2.DatabaseError, e:
        if con:
             con.rollback()
        print e
        sys.exit


def get_db():
    if not (con and cur and db):
        connect()
    return (con, cur, db)

函数2.

代码语言:javascript
复制
import function1

con, cur, db = function1.get_db()

def function:
    db("SELECT * INTO new_table FROM old_table")
    con.commit()

没有办法使某些变量对包中的每个模块都是全局的。您已经显式地从它们所在的任何模块导入它们,或者通过函数调用返回它们。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24996370

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档