SQLAlchemy学习-11.结合 dataclass 使用

前言

SQLAlchemy 可以结合 dataclass 使用,python3.7以上版本自带了dataclasses模块。

结合 dataclass 使用

使用示例

from dataclasses import dataclass, field
from datetime import datetime
from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String, TIMESTAMP
from sqlalchemy.orm import sessionmaker, mapper

metadata = MetaData()
person_table = \
    Table('person', metadata,
          Column('id', Integer, primary_key=True, autoincrement=True),
          Column('name', String(255)),
          Column('age', Integer),
          Column('birthday', TIMESTAMP)
          )


@dataclass
class Person:
    id: int = None
    name: str = field(default_factory=str)
    age: int = field(default_factory=int)
    birthday: datetime = field(default_factory=datetime)


mapper(Person, person_table)

engine = create_engine('mysql+pymysql://root:aa123456@47.108.155.10:3309/web', echo=True)
metadata.create_all(engine)
session = sessionmaker(bind=engine)()

# 新增数据提交
person = Person(name='Robby', age=33, birthday=datetime(1985, 7, 25))
session.add(person)
session.commit()

执行后,生成 person 表

结合您提供的代码片段,这是一个基本的框架,我们将它们整合在一起。请注意,这只是一个示例,实际的实现可能需要根据您的数据库配置、具体表结构以及实际需求调整。假设我们已经有了上述的`datetime`处理、数据库连接和表操作方法,以下是整合后的代码: ```python from sqlalchemy import create_engine, MetaData, Table, select, insert import datetime class DataProcessor: def __init__(self, database_conn): self.engine = create_engine(database_conn) self.metadata = MetaData(bind=self.engine) self.transactions_table = Table('transactions', self.metadata, autoload_with=self.engine) self.hourly_vehicle_counts_table = Table('hourly_vehicle_counts', self.metadata, autoload_with=self.engine) def str_to_time(self, t): return datetime.datetime.strptime(t, '%YY%mm%dd%HH%MM') def time_to_str(self, t): return t.strftime('%YY%mm%dd%HH%MM') def get_five_minute_interval(self, t): # ... (上文已经提供) def get_past_time(self, current_time, minutes): past_mins_ago = current_time - datetime.timedelta(minutes=minutes) query = select([self.transactions_table]).where(self.transactions_table.c.transtime >= self.time_to_str(past_mins_ago)) return query def process_data(self, m): with self.engine.begin() as conn: # 获取过去m分钟的数据 transaction_results = conn.execute(self.get_past_time(datetime.datetime.now(), m)) # 初始化分类计数器 data_by_model = {} for row in transaction_results: model = row.vehicle_model time_key = self.get_five_minute_interval(self.time_to_str(row.transtime)) # 更新计数 if time_key not in data_by_model: data_by_model[time_key] = {model: 0} data_by_model[time_key][model] += 1 # 插入到数据库 insert_data = [(time_key, model, count) for time_key, model_count in data_by_model.items() for model, count in model_count.items()] insert_query = insert_statement(self.hourly_vehicle_counts_table, ['time_interval', 'model', 'count'], insert_data) try: conn.execute(insert_query) except Exception as e: print(f"Error inserting data: {e}") # 示例数据库连接 database_conn = 'your_database_connection_string' processor = DataProcessor(database_conn) processor.process_data(30) # 处理过去30分钟的数据 ``` 这里的`insert_statement`是一个假设的函数,用于构造插入数据的SQL语句。在实际应用中,您需要将其替换为正确的插入语句。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值