Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中操作数据库结果集的最佳实践?_Python_Database - Fatal编程技术网

在Python中操作数据库结果集的最佳实践?

在Python中操作数据库结果集的最佳实践?,python,database,Python,Database,我正在编写一个简单的pythonweb应用程序,它由为iPhone格式化的几页业务数据组成。我很熟悉Python编程,但我对Python的“习惯用法”不太熟悉,尤其是关于类和对象。Python的面向对象设计与我使用过的其他语言有些不同。因此,即使我的应用程序正在运行,我还是很好奇是否有更好的方法来实现我的目标 细节:通常如何在Python中实现请求转换渲染数据库工作流?目前,我正在使用pyodbc获取数据,将结果复制到对象的属性中,使用这些对象的列表执行一些计算和合并,然后呈现对象列表的输出。(

我正在编写一个简单的pythonweb应用程序,它由为iPhone格式化的几页业务数据组成。我很熟悉Python编程,但我对Python的“习惯用法”不太熟悉,尤其是关于类和对象。Python的面向对象设计与我使用过的其他语言有些不同。因此,即使我的应用程序正在运行,我还是很好奇是否有更好的方法来实现我的目标

细节:通常如何在Python中实现请求转换渲染数据库工作流?目前,我正在使用pyodbc获取数据,将结果复制到对象的属性中,使用这些对象的列表执行一些计算和合并,然后呈现对象列表的输出。(下面是示例代码,SQL查询已编辑。)这是否正常?有更好的办法吗?在我对Python的相对无知中,有没有遇到过任何具体的“陷阱”?我特别关心如何使用空的“Record”类实现行列表


你考虑过使用ORM吗?很好,很漂亮。它确实可以减少处理数据库所需的样板代码量。此外,前面提到的许多问题已经出现,SQLAlchemy开发人员已经解决了这些问题。

在iPhone应用程序中使用ORM可能是个坏主意,因为性能问题,您希望代码尽可能快。所以你不能避免样板代码。如果您正在考虑ORM,除了SQLAlchemy之外,我推荐Storm。

根据您对数据的处理程度,您可能不需要填充中间对象。游标的标题数据结构将允许您获取列名——稍微内省一下将允许您使用col name:value对为行创建一个字典。 您可以将字典传递给%运算符。odbc模块的文档将解释如何获取列元数据

这段代码以这种方式显示%运算符的应用程序

>>> a={'col1': 'foo', 'col2': 'bar', 'col3': 'wibble'}
>>> 'Col1=%(col1)s, Col2=%(col2)s, Col3=%(col3)s' % a
'Col1=foo, Col2=bar, Col3=wibble'
>>> 

空记录类和(通常)应用于单个记录的自由浮动函数暗示您没有正确设计类

class Record( object ):
    """Assuming rtda and pnl must exist."""
    def __init__( self ):
        self.da= 0
        self.rt= 0
        self.rtda= 0 # or whatever
        self.pnl= None # 
        self.sink = None # Not clear what this is
    def setPnl( self, node_prices ):
        # fill RT and DA prices from the hash retrieved above
        # calculate dependent values: RT-DA and PNL
def calculate_pnl( records, node_prices ):
    for record in records:
        record.setPnl( node_prices )
现在,您的
计算\u pnl(记录、节点\u价格)
更简单,并且正确地使用了对象

class Record( object ):
    """Assuming rtda and pnl must exist."""
    def __init__( self ):
        self.da= 0
        self.rt= 0
        self.rtda= 0 # or whatever
        self.pnl= None # 
        self.sink = None # Not clear what this is
    def setPnl( self, node_prices ):
        # fill RT and DA prices from the hash retrieved above
        # calculate dependent values: RT-DA and PNL
def calculate_pnl( records, node_prices ):
    for record in records:
        record.setPnl( node_prices )
重点不在于以小的方式对代码进行琐碎的重构

关键是:类封装了责任

是的,一个空的类通常是一个问题。这意味着责任分散在其他地方

类似的分析也适用于记录的收集。这不仅仅是一个简单的列表,因为集合(作为一个整体)具有它所执行的操作

“请求变换渲染”不太正确。你有一个模型(记录类)。生成模型实例(可能是因为请求)。模型对象负责自己的状态转换和更新。也许它们会被某个检查其状态的对象显示(或渲染)


正是这一“转换”步骤常常违反了良好的设计,将责任分散到各个地方。“转换”是非对象设计的延续,在非对象设计中,责任是一个模糊的概念。

我认为ORM不合适。我根本不希望写入数据库——这是一个严格意义上的数据显示项目。编写查询也不是问题(事实上,我计划简化我在上面发布的第一个代码草案,以消除循环中的查询问题)。ORM将位于服务器端。我知道ORM会增加一些开销,但手机网络将是真正的延迟诱导器。ORM是Python中的。可以在客户机上。ORM将纯SQL发送到服务器。正如我在问题的第一句中所说,这是一个web应用程序。Python代码位于服务器上。另外,我对ORM不太感兴趣,因为我只有少数集合只读查询需要实现。SQLAlchemy不是ActiveRecord样式的ORM,而是一个非常高效的数据映射器。SQLAlchemy还为您想要的结果集生成理想的查询,并且不会执行过多的多重查询…使用dict与使用对象作为中间行有什么好处或缺点?我确实需要某种中间步骤,因为我需要计算并在每一行中添加额外的列。如果您只是从查询结果的内容中呈现一些内容,则“%”运算符可以将字典值替换为用%(xxx)s运算符标记的占位符。对于简单的任务,这比实例化模型或DB行对象更简单。感谢您花时间阅读我发布的内容,并提供了深思熟虑的回复。我得考虑一下你的建议,它确实有道理。写了一本关于OO设计的书。不是很好,但是很完整。这一点很难理解。看见