我正在重写一个 python 脚本以将来自 arduino 的数据存储在 postgresql 数据库中,希望使用python-daemon将其作为守护程序运行。原始脚本工作正常,但在守护进程中,我无法写入数据库。第一次尝试以:
<class 'psycopg2.DatabaseError'>, DatabaseError('SSL SYSCALL error: EOF detected\n'
进而:
<class 'psycopg2.InterfaceError'>, InterfaceError('cursor already closed',)
在工作脚本中,我这样做:
connstring="dbname='"+dbdatabase+"' user='"+dbusername+"' host='"+dbhost+"'password='"+dbpassword+"'"
try:
conn = psycopg2.connect(connstring)
cur=conn.cursor()
except:
my_logger.critical(appname+": Unable to connect to the database")
sys.exit(2)
sql="insert into measure (sensorid,typeid,value) VALUES(%s,%s,%s)"
< more to set up serialport, logging and so on>
while 1:
< fetch a data set and split it to a list >
for (i,val) in enumerate measures:
try:
cur.execute(sql,(sensors[i],typeid[i],val))
conn.commit()
except:
self.logger.error(appname+": error 106 :"+str(sys.exc_info()))
我有一种感觉,这可能与我最初使用串行连接时遇到的一些相同问题,串行端口在重写的 Python 代码中不起作用,所以我试图摆弄files_preserve
,做:
self.files_preserve=range(daemon.daemon.get_maximum_file_descriptors()+1)
据我所知,应该保持打开所有文件句柄,但无济于事。
在守护进程中,我首先尝试将数据库连接设置为属性__init__
,即:
self.conn = psycopg2.connect(connstring)
self.cur=conn.cursor()
然后在run
方法中进行插入。我还尝试在run
方法的顶部创建连接,甚至将其设置为全局对象,但在所有情况下,似乎都在杀死数据库连接。有什么线索吗?(或在哪里可以找到守护程序模块的一些文档(源除外)的任何线索?)
守护进程和数据库都在使用 python 2.7 and postgresql
8.4` 的 debian linux 系统上运行。