帮助解释Python代码段

时间:2011-09-07 20:31:17

标签: python

我在网上找到了以下内容,但是从我与Python的小小曝光中我知道可以将功能附加到对象中。我也知道Python中的所有东西都是对象。我还没有理解下面打算实现的目的及其用例。 这是我需要帮助的部分:

run_sql_command.c = c

def get_sql_object(c):
    def run_sql_command(command, arguments=[]):
        c.execute(command, arguments)
        return c.fetchall()
    run_sql_command.c = c
    return run_sql_command

3 个答案:

答案 0 :(得分:3)

这里的想法(我相信)是有人正在创建一个占位符对象,该对象继续引用游标c,以便以后可以用它来执行查询。建议用法可能是这样的:

c = DBConnectionObject.cursor()

myExecutor = get_sql_object(c)

# some amount of code later
rows = myExecutor(Queries.GetAllUsersByFName, ['Larry', 'Bob'])

- 解决一些意见 -

我发现尝试保留游标可能会在易失性环境中导致问题,因为并不总是保证数据库连接保持连接。我选择这种方法:

class DBConnection(object):
  def __init__(self, dbpath):
    self.dbPath = dbpath

    # Any connection object here, really.
    self._conn = kinterbasdb.connect()

  def cursor(self, query, params = None):
    try:
      cursor = self._conn.cursor()

      if params:
        cursor.execute(query, params)
      else:
        cursor.execute(query)

      return cursor
    except (kdb.ProgrammingError, AttributeError), e:
        print e

  def qry(self, query, params = None):
    cursor = self.cursor(query, params)

    return [[x[0].title() for x in cursor.description]] + [r for r in cursor.fetchall()]

然后,您将创建一个全局数据库连接,如下所示:

dbcon = DBConnection('/path/to/mydb.fdb')

并使用以下命令运行查询:

rows = dbcon.qry(Queries.GetSomething)

或:

filtered = dbcon.qry(Queries.FilteredQuery, ['my', 'parameters'])

如果连接断开,我省略了一些错误处理/重新连接到数据库的代码,但总体思路就在那里。这样,游标在需要,使用和允许超出范围时创建,让我集中处理错误。

答案 1 :(得分:0)

我认为run_sql_command.c可以保留对c的可访问引用,例如稍后关闭它。

答案 2 :(得分:0)

该行向函数c添加属性run_sql_command,为其提供传递给函数get_sql_object()的值,可能是数据库游标。你可能已经知道了很多。

由于此代码段的范围有限,该语句完全没有用处。在更大的上下文中,可以在代码中的其他地方重用游标。在代码的其他部分中查找.c属性的访问权限,看看它是如何完成的。