-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmodels.py
More file actions
52 lines (43 loc) · 1.5 KB
/
Copy pathmodels.py
File metadata and controls
52 lines (43 loc) · 1.5 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
from __future__ import annotations
from typing import Optional
from datetime import datetime
from sqlalchemy import CheckConstraint
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, session
from sqlalchemy.schema import PrimaryKeyConstraint
from sqlalchemy.dialects.sqlite import insert
class Base(DeclarativeBase):
pass
class Stock(Base):
__tablename__ = "stock_ohlcv"
symbol: Mapped[str]
open: Mapped[float]
high: Mapped[float]
low: Mapped[float]
close: Mapped[Optional[float]]
adjusted_close: Mapped[Optional[float]]
volume: Mapped[int]
dividend_amount: Mapped[Optional[float]]
timestamp: Mapped[datetime]
__table_args__ = (
PrimaryKeyConstraint("symbol", "timestamp"),
CheckConstraint(
"close IS NOT NULL OR adjusted_close IS NOT NULL",
name="check_close_or_adjusted_close_not_null",
),
)
@classmethod
def insert_multiple(cls, rows: List[Stock], session: session):
stock_dicts = []
for row in rows:
stock_dicts.append(
{
key: value
for key, value in row.__dict__.items()
if key != "_sa_instance_state"
}
)
for i in range(0, len(stock_dicts), 100):
stmt = (
insert(Stock).values(stock_dicts[i : i + 100]).on_conflict_do_nothing()
)
session.execute(stmt)