繁体   English   中英

帮助解释Python代码段

[英]Help interpreting Python code snippet

我在网上找到了以下内容,但是从我很少接触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

这里的想法(我相信)是有人在创建一个占位符对象,该对象保留对游标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'])

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

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

该行在函数run_sql_command添加了属性c ,为它提供了传递给函数get_sql_object()的值get_sql_object()可能是数据库游标)。 您可能已经很了解。

由于此代码段的范围有限,因此该语句完全没有用。 在较大的上下文中,可以在代码的其他位置重复使用光标。 在代码的其他部分中查找对.c属性的访问,并查看对它的处理方式。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM