覆盖sqlalchemy中的表名

时间:2014-11-30 01:29:03

标签: sqlalchemy

我有三组相似表的数据库,大约100M行数据。

raw_measurements working_measurements 测量

raw_measurements包含来自各种传感器的csvs的未掺杂数据,这些传感器不断发送数据。每小时左右运行一次ETL过程以清理并添加一些计算列。该脚本的最终结果将被放入测量中,这是指向数据可视化表的位置。

此外,在转换数据时,有一个名为working_measurements的表,其中etl脚本实际上会影响。最后一步是将working_measurements重命名为测量值,以便始终为visualizaion软件提供干净的副本。

然而,在我的脚本中,我有三个基本相同数据的模型(这是问题),如下所示:

class WorkingMeasurement(Base):
  __tablename__ = "working_measurements"
  id = Column(Integer, primary_key=True)
  box_serial = Column(Integer)
  cycle_id = Column(String(64))
  timestamp = Column(Date)
  wheel = Column(Integer)
  pressure = Column(Float)
  latitude = Column(Float)
  longitude = Column(Float)
  ...

和其他像这样的

class RawMeasurement(Base):
  __tablename__ = "raw_measurements"
  id = Column(Integer, primary_key=True)
  box_serial = Column(Integer)
  cycle_id = Column(String(64))
  timestamp = Column(Date)
  wheel = Column(Integer)
  pressure = Column(Float)
  latitude = Column(Float)
  longitude = Column(Float)
  ...

而另一个是这样的:

class Measurement(Base):

  __tablename__ = "measurements"
  id = Column(Integer, primary_key=True)
  box_serial = Column(Integer)
  cycle_id = Column(String(64))
  timestamp = Column(Date)
  wheel = Column(Integer)
  pressure = Column(Float)
  latitude = Column(Float)
  longitude = Column(Float)
  ...

有没有办法不重复这些信息,只覆盖 tablename

1 个答案:

答案 0 :(得分:1)

请阅读文档的Mixin and Custom Base Classes部分。下面的代码可以完成这项工作:

from sqlalchemy.ext.declarative import declared_attr

def to_underscore(name):
    import re
    s1 = re.sub('(.)([A-Z][a-z]+)', r'\1_\2', name)
    return re.sub('([a-z0-9])([A-Z])', r'\1_\2', s1).lower()


class MeasurementMixin(object):
    @declared_attr
    def __tablename__(cls):
        return to_underscore(cls.__name__)

    id = Column(Integer, primary_key=True)
    box_serial = Column(Integer)
    cycle_id = Column(String(64))
    timestamp = Column(Date)
    wheel = Column(Integer)
    pressure = Column(Float)
    latitude = Column(Float)
    longitude = Column(Float)


class WorkingMeasurement(MeasurementMixin, Base):
    pass


class RawMeasurement(MeasurementMixin, Base):
    pass


class Measurement(MeasurementMixin, Base):
    pass