使用Python

时间:2018-02-14 15:22:21

标签: python database postgresql

我正在尝试使用Python脚本将信息保存到Postgresql中的数据库。 对于更一般的解释我正在使用Rails创建WebApp,我在其中调用一个作业来运行python脚本来处理一些图像和数据,之后,我希望将它们保存到我的数据库中。

其他方面,我正在将图像上传到AWS S3,等待上传完成后再将信息保存到数据库中。

我用来上传信息的python代码如下:

# Function which connects wit postgresql and uploads into the database
#....(Asume param and model_id are known variables, which i do not post it here.) 

def insert_param(param, model_id):
    con = None
    try:
        con = psycopg2.connect("host='localhost' 
                               dbname='app_development' 
                               user='usr' 
                               password=''")
        wait(con)
        cur = con.cursor()
        cur.execute("UPDATE M_Param SET Model=%s WHERE Id=%s",(param, model_id))
        con.commit()

    except Exception, e:
         print  e
         if con:
            con.rollback()

        print 'Error %s' % e
        sys.exit(1)

    finally:   
        if con:
            con.close()

#Function which wait for the connection to the database to be ready.
def wait(conn):
    while 1:
        state = conn.poll()
        if state == psycopg2.extensions.POLL_OK:
            print "Poll Conection OK"
            break
        elif state == psycopg2.extensions.POLL_WRITE:
            print "Poll writting"
            select.select([], [conn.fileno()], [])
        elif state == psycopg2.extensions.POLL_READ:
            print "Poll reading"
            select.select([conn.fileno()], [], [])
        else:
            raise psycopg2.OperationalError("poll() returned %s" % state)

#Here I call the first function
insert_count(param,model_id)

我有时会将数据上传到postgresql,这些信息没有上传的随机情况。 我尝试从数据库中提取数据然后提交,但我什么都没有,也没有从那些尝试中获得有价值的信息。

以下是我的问题:

  • 我保存和将信息提交到数据库的方式有问题吗?
  • 在继续运行更多代码之前,是否需要等待提交才能使用某些回调返回“ok”状态?

非常欢迎任何帮助,参考或反馈。

1 个答案:

答案 0 :(得分:0)

我发现了问题,它不在python代码中,而是在执行python脚本的方式

当我调用python脚本时,调用解释器,但在python任务完成之前我已经再次调用脚本,这使得解释器关闭并重新打开,而不是让前一个任务完成(ergo,不是提交到数据库)。

避免此问题的一些可行方法是:

  • 将列表中的不同任务排入另一台服务器中始终运行的python脚本。
  • 使用sidekiq Gem使所有python脚本在不同的线程中运行。 (或其他一些后端线程方法)

我希望这些发现可以帮助其他人和我一样。