我有三组相似表的数据库,大约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 ?
答案 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