在fork中使用sqlanydb启动数据库连接

2 投票
3 回答
3442 浏览
提问于 2025-04-18 01:00

根据一个关于分叉(forking)的例子,我写了这个小脚本:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sqlanydb
import os

def child():
    conn = sqlanydb.connect(uid='dba', pwd='sql', eng='somedb_IQ', dbn='somedb')
    curs = conn.cursor()
    curs.execute("""SELECT * FROM foobaa;""")
    os.exit(0)

def parent():
   while True:
      newpid = os.fork()
      if newpid == 0:
         child()
      else:
         pids = (os.getpid(), newpid)
         print "parent: %d, child: %d" % pids
      if raw_input( ) == 'q': break

parent()

我的目的是在一个单独的进程中进行数据库操作(我以后想要的目标是同时运行大量的查询)。

但是在运行这个脚本时,我遇到了:

parent: 20580, child: 20587
Traceback (most recent call last):
  File "connectiontest.py", line 25, in <module>
    parent()
  File "connectiontest.py", line 19, in parent
    child()
  File "connectiontest.py", line 8, in child
    conn = sqlanydb.connect(uid='dba', pwd='sql', eng='somedb_IQ', dbn='somedb')
  File "/usr/local/lib/python2.6/dist-packages/sqlanydb.py", line 461, in connect
    return Connection(args, kwargs)
  File "/usr/local/lib/python2.6/dist-packages/sqlanydb.py", line 510, in __init__
    self.handleerror(*error)
  File "/usr/local/lib/python2.6/dist-packages/sqlanydb.py", line 520, in handleerror
    eh(self, None, errorclass, errorvalue)
  File "/usr/local/lib/python2.6/dist-packages/sqlanydb.py", line 342, in standardErrorHandler
    raise errorclass(errorvalue)
sqlanydb.OperationalError: Failed to initialize connection object

我可能遗漏了什么呢?

3 个回答

0

你需要对 sqlanydb 的源代码进行一些修改,以便能打印出实际出现的错误。现在的问题被一个通用的 OperationalError 给掩盖了,这个错误信息不够详细,无法帮助你解决问题。在 510 行,你需要添加几个 print 语句,这样才能弄清楚到底发生了什么(或者没有发生什么)。

1

因为Sybase IQ是基于Sybase ASA的,你确定你使用的凭证密钥是正确的吗?这份(虽然有点旧的)文档看起来是需要DSN和DSF,而不是ENG和DBN。

http://dcx.sybase.com/1101/en/dbprogramming_en11/python-writing-open.html

1

这个问题似乎在把 import sqlanydb 移到子方法(child() 方法)里面时就不会出现了。所以代码可能看起来像这样:

def child():
    import sqlanydb

    conn = sqlanydb.connect(uid='dba', pwd='sql', dsn='some_db')
    curs = conn.cursor()
    curs.execute("""SELECT * FROM SA100_1_1;""")
    curs.close()
    conn.close()

撰写回答