Skip to content

Commit 451dce9

Browse files
Merge pull request #65 from observerly/refactor/alembic/sqlite
refactor: Amended database usage to sqlite => v3.40.0.
2 parents 3b05acc + e804823 commit 451dce9

File tree

14 files changed

+61
-108
lines changed

14 files changed

+61
-108
lines changed

.env.config

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,6 @@
11
FIRST_SUPERUSER_EMAIL
22
FIRST_SUPERUSER_PASSWORD
33

4-
POSTGRES_USER="postgres"
5-
POSTGRES_PASSWORD="postgres"
6-
POSTGRES_SERVER="db"
7-
POSTGRES_PORT="5432"
8-
POSTGRES_DB="postgres"
9-
104
PROJECT_NAME="Perseus FastAPI"
115
PROJECT_ENVIRONMENT
126
SENTRY_DSN

.github/workflows/ci.yml

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,6 @@ jobs:
2424
PROJECT_NAME: "Perseus FastAPI"
2525
FIRST_SUPERUSER_EMAIL: ${{ secrets.FIRST_SUPERUSER_EMAIL }}
2626
FIRST_SUPERUSER_PASSWORD: ${{ secrets.FIRST_SUPERUSER_PASSWORD }}
27-
POSTGRES_USER: "postgres"
28-
POSTGRES_PASSWORD: "postgres"
29-
POSTGRES_SERVER: "db"
30-
POSTGRES_PORT: "5432"
31-
POSTGRES_DB: "postgres"
3227
SENTRY_DSN: ${{ secrets.SENTRY_DSN }}
3328
SERVER_NAME: "perseus"
3429
SERVER_HOST: "https://perseus.observerly.com"
@@ -43,11 +38,6 @@ jobs:
4338
echo PROJECT_NAME=${PROJECT_NAME} >> .env
4439
echo FIRST_SUPERUSER_EMAIL=${FIRST_SUPERUSER_EMAIL} >> .env
4540
echo FIRST_SUPERUSER_PASSWORD=${FIRST_SUPERUSER_PASSWORD} >> .env
46-
echo POSTGRES_USER=${POSTGRES_USER} >> .env
47-
echo POSTGRES_PASSWORD=${POSTGRES_PASSWORD} >> .env
48-
echo POSTGRES_SERVER=${POSTGRES_SERVER} >> .env
49-
echo POSTGRES_PORT=${POSTGRES_PORT} >> .env
50-
echo POSTGRES_DB=${POSTGRES_DB} >> .env
5141
echo SENTRY_DSN=${SENTRY_DSN} >> .env
5242
echo SERVER_NAME=${SERVER_NAME} >> .env
5343
echo SERVER_HOST=${SERVER_HOST} >> .env

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,8 @@ coverage.xml
6060
local_settings.py
6161
db.sqlite3
6262
db.sqlite3-journal
63+
*.db.sqlite3
64+
*.db.sqlite3-journal
6365

6466
# Flask stuff:
6567
instance/

alembic/env.py

Lines changed: 1 addition & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
from __future__ import with_statement
22

3-
import os
43
from logging.config import fileConfig
54

65
from sqlalchemy import engine_from_config, pool
@@ -32,19 +31,7 @@
3231

3332

3433
def get_url():
35-
user = os.getenv("POSTGRES_USER", "postgres")
36-
password = os.getenv("POSTGRES_PASSWORD", "")
37-
server = os.getenv("POSTGRES_SERVER", "db")
38-
db = os.getenv("POSTGRES_DB", "app")
39-
port = os.getenv("POSTGRES_PORT", "5432")
40-
ssl = os.getenv("POSTGRES_SSL", "false")
41-
42-
url = f"postgresql://{user}:{password}@{server}:{port}/{db}"
43-
44-
if ssl == "true":
45-
return f"{url}?sslmode=require"
46-
47-
return url
34+
return "sqlite:///./perseus.db.sqlite3"
4835

4936

5037
def run_migrations_offline():

alembic/versions/d246e2f4a338_feat_added_body_model_e_g_star_galaxy_.py renamed to alembic/versions/38650ea42efd_feat_added_body_model_e_g_star_galaxy_.py

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,16 @@
11
"""feat: Added Body model (e.g., Star, Galaxy, Nebulae etc.)
22
3-
Revision ID: d246e2f4a338
3+
Revision ID: 38650ea42efd
44
Revises:
5-
Create Date: 2022-08-29 14:45:24.960549
5+
Create Date: 2022-11-29 17:31:11.612686
66
77
"""
88
import sqlalchemy as sa
9-
from sqlalchemy.dialects import postgresql
109

1110
from alembic import op
1211

1312
# revision identifiers, used by Alembic.
14-
revision = "d246e2f4a338"
13+
revision = "38650ea42efd"
1514
down_revision = None
1615
branch_labels = None
1716
depends_on = None
@@ -21,7 +20,7 @@ def upgrade():
2120
# ### commands auto generated by Alembic - please adjust! ###
2221
op.create_table(
2322
"body",
24-
sa.Column("uid", postgresql.UUID(as_uuid=True), nullable=False),
23+
sa.Column("uid", sa.String(), nullable=False),
2524
sa.Column(
2625
"name", sa.String(length=180), nullable=True, comment="Common or IAU Name"
2726
),
@@ -156,4 +155,4 @@ def downgrade():
156155
op.drop_index(op.f("ix_body_constellation"), table_name="body")
157156
op.drop_index(op.f("ix_body_bd"), table_name="body")
158157
op.drop_table("body")
159-
# ### end Alembic commands ###root@504aaea6537f:/usr/src/app/alembic/versions#
158+
# ### end Alembic commands ###

app/core/config.py

Lines changed: 3 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from secrets import token_urlsafe
22
from typing import Any, Dict, List, Optional, Union
33

4-
from pydantic import AnyHttpUrl, BaseSettings, EmailStr, HttpUrl, PostgresDsn, validator
4+
from pydantic import AnyHttpUrl, BaseSettings, EmailStr, HttpUrl, validator
55

66

77
class Settings(BaseSettings):
@@ -43,26 +43,13 @@ def assemble_cors_origins(cls, v: Union[str, List[str]]) -> Union[List[str], str
4343
return v
4444
raise ValueError(v)
4545

46-
POSTGRES_SERVER: str
47-
POSTGRES_USER: str
48-
POSTGRES_PASSWORD: str
49-
POSTGRES_DB: str
50-
POSTGRES_PORT: str
51-
52-
SQLALCHEMY_DATABASE_URI: Optional[PostgresDsn] = None
46+
SQLALCHEMY_DATABASE_URI: Optional[str] = None
5347

5448
@validator("SQLALCHEMY_DATABASE_URI", pre=True)
5549
def assemble_db_connection(cls, v: Optional[str], values: Dict[str, Any]) -> Any:
5650
if isinstance(v, str):
5751
return v
58-
return PostgresDsn.build(
59-
scheme="postgresql",
60-
user=values.get("POSTGRES_USER"),
61-
password=values.get("POSTGRES_PASSWORD"),
62-
host=values.get("POSTGRES_SERVER"),
63-
port=values.get("POSTGRES_PORT"),
64-
path=f"/{values.get('POSTGRES_DB') or ''}",
65-
)
52+
return "sqlite:///./perseus.db.sqlite3"
6653

6754
SENTRY_DSN: Optional[HttpUrl]
6855

app/crud/crud_body.py

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ def perform_name_search_filter(
117117

118118
if name:
119119
query = query.filter(
120-
or_(self.model.name.op("%")(name), self.model.iau.op("%")(name))
120+
or_(self.model.name.op("LIKE")(name), self.model.iau.op("LIKE")(name))
121121
)
122122

123123
return query
@@ -129,7 +129,7 @@ def perform_constellation_search_filter(
129129
constellation = getattr(query_params, "constellation", None)
130130

131131
if constellation:
132-
query = query.filter(self.model.constellation.op("%")(constellation))
132+
query = query.filter(self.model.constellation.op("LIKE")(constellation))
133133

134134
return query
135135

@@ -167,9 +167,15 @@ def get_multi(
167167

168168
count = query.count()
169169

170-
# Here we are ordering by apparent magnitude (mag) in descending order because
170+
# Here we are ordering by apparent magnitude (mag) in ascending order because
171171
# negative magnitudes are actually "brighter" than positive magnitudes:
172-
return query.order_by(self.model.m).offset(skip).limit(limit).all(), count
172+
return (
173+
query.order_by(func.coalesce(Body.m, 99999).asc())
174+
.offset(skip)
175+
.limit(limit)
176+
.all(),
177+
count,
178+
)
173179

174180

175181
body = CRUDBody(Body)

app/db/session.py

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,26 @@
1-
from sqlalchemy import create_engine
1+
import math
2+
3+
from sqlalchemy import create_engine, event
24
from sqlalchemy.orm import sessionmaker
35

46
from app.core.config import settings
57

6-
if settings.PROJECT_ENVIRONMENT == "production":
7-
if settings.SQLALCHEMY_DATABASE_URI is None:
8-
raise Exception("settings.SQLALCHEMY_DATABASE_URI is None")
9-
engine = create_engine(
10-
"{}?sslmode=require".format(settings.SQLALCHEMY_DATABASE_URI),
11-
pool_pre_ping=True,
12-
)
13-
else:
14-
engine = create_engine(settings.SQLALCHEMY_DATABASE_URI, pool_pre_ping=True)
8+
engine = create_engine(
9+
settings.SQLALCHEMY_DATABASE_URI,
10+
pool_pre_ping=True,
11+
connect_args={"check_same_thread": False},
12+
)
13+
14+
15+
@event.listens_for(engine, "connect")
16+
def create_math_functions_on_connect(dbapi_connection, connection_record):
17+
dbapi_connection.create_function("sin", 1, math.sin)
18+
dbapi_connection.create_function("cos", 1, math.cos)
19+
dbapi_connection.create_function("asin", 1, math.asin)
20+
dbapi_connection.create_function("radians", 1, math.radians)
21+
dbapi_connection.create_function("degrees", 1, math.degrees)
22+
dbapi_connection.create_function("sqrt", 1, math.sqrt)
23+
dbapi_connection.create_function("pow", 2, math.pow)
24+
1525

1626
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)

app/models/body.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
from astropy.coordinates import EarthLocation, SkyCoord
77
from astropy.time import Time
88
from sqlalchemy import Column, Float, String, event
9-
from sqlalchemy.dialects.postgresql import UUID
109
from sqlalchemy.ext.hybrid import hybrid_method
1110
from sqlalchemy.sql import func
1211

@@ -15,12 +14,16 @@
1514
FRAME = "icrs"
1615

1716

17+
def generate_uuid():
18+
return str(uuid.uuid4())
19+
20+
1821
class Body(Base):
1922
# UID as primary key
2023
uid = Column(
21-
UUID(as_uuid=True),
24+
String,
2225
primary_key=True,
23-
default=uuid.uuid4,
26+
default=generate_uuid,
2427
)
2528

2629
# Common Name

app/tests/api/api_v1/test_bodies.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -177,8 +177,8 @@ async def test_list_bodies_within_the_constellation_orion(client: AsyncClient) -
177177
assert body["results"][13]["name"] == "λ Orionis"
178178
assert body["results"][14]["name"] == "τ Orionis"
179179
assert body["results"][15]["name"] == "π⁴ Orionis"
180-
assert body["results"][16]["name"] == "ζ Orionis"
181-
assert body["results"][17]["name"] == "π⁵ Orionis"
180+
assert body["results"][16]["name"] == "π⁵ Orionis"
181+
assert body["results"][17]["name"] == "ζ Orionis"
182182
assert body["results"][18]["name"] == "σ Orionis"
183183
assert body["results"][19]["name"] == "ο² Orionis"
184184

0 commit comments

Comments
 (0)