横跨python文件的psycopg2

时间:2014-07-28 13:28:53

标签: python initialization psycopg2

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

我有以下内容:

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的内容如下所示:

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连接。它看起来像这样(在function1.py文件中):

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,使用类似下面的内容:

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

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

1 个答案:

答案 0 :(得分:0)

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

<强> function1.py

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)

<强> function2.py

import function1

con, cur, db = function1.get_db()

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

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