Python最佳实践:数据模型

时间:2017-04-25 12:23:57

标签: python database

我目前正在开发几个涉及数据处理,存储和Web界面的Python包。

为了将存储的数据(在数据库中)链接到Web界面,我当前正在使用表示通过所有这些包使用的数据的类。因此,这些类包含从数据库加载和转换原始数据,转换回并保存在数据库中的方法,以及特定于数据所代表的概念类型的处理方法。

我想将这些类分解为更加隔离的方法。例如,一方面,数据模型类包含数据库中包含的原始数据,另一方面基于原始数据(数据模型类的实例)的类来执行专题工作。

为了说明我的情况,让我们考虑一个包含表格的数据库" localized_event"字段是:   - 日期(作为unix时间标签,整数)   - 纬度(作为浮点值)   - 经度(作为浮点值)

我现在拥有的是一个能够从原始数据加载的单个类( from_dict 方法),生成SQL来保存( sql_insert 方法)但仍然为用户提供进化的属性( datetime 等):

from dummy_geo_module import LatLon

from datetime import datetime
from datetime import timedelta

...

class LocalizedEvent(object):

    def __init__(self, date_event, latitude, longitude):

        if isinstance(self.start_validity, int):
            self.date_event = datetime.utcfromtimestamp(0) + timedelta(seconds=timestamp)
        else:
            self.date_event = date_event

        self.geo_coord = LatLon(latitude, longitude)

    @classmethod
    def from_dict(cls, dict):
        return cls(None if 'date_event' not in dict.keys() else dict['date_event'],
                   None if 'latitude' not in dict.keys() else dict['latitude'],
                   None if 'longitude' not in dict.keys() else dict['longitude'])

    def sql_insert(self, table):
        query = 'INSERT OR IGNORE INTO ' + table + ' ' + '(date_event, latitude, longitude) VALUES ?, ?, ?'
        return query, self.get_table_tuple()

    def get_table_tuple(self):
        return (int((self.date_event - datetime(1970, 1, 1)) / timedelta(seconds=1)),
            self.geo_coord.lat, 
                self.geo_coord.lon,)

    ...

分割这个类似乎很好,(i)与数据库交互的数据模型类:

class LocalizedEventData(object):

    def __init__(self, date_event, latitude, longitude):

        self.date_event = date_event
        self.latitude = latitude
        self.longitude = longitude

    @classmethod
    def from_dict(cls, dict):
        return cls(None if 'date_event' not in dict.keys() else dict['date_event'],
                   None if 'latitude' not in dict.keys() else dict['latitude'],
                   None if 'longitude' not in dict.keys() else dict['longitude'])

    def sql_insert(self, table):
        query = 'INSERT OR IGNORE INTO ' + table + ' ' + '(date_event, latitude, longitude) VALUES ?, ?, ?'
        return query, (self.date_event, self.latitude, self.longitude)

    ...

和(ii)用于处理的类(使用演化属性和任何类型的方法)等。

from dummy_geo_module import LatLon

from datetime import datetime
from datetime import timedelta

...

class LocalizedEvent(object):

    def __init__(self, locevt_data):

        self.date_event = datetime.utcfromtimestamp(0) + timedelta(seconds=locevt_data.timetag_event)
        self.geo_coord = LatLon(locevt_data.latitude, locevt_data.longitude)

    ...

有关此类设计的最佳做法的任何建议吗?

0 个答案:

没有答案