mirror of
https://github.com/grillazz/fastapi-sqlalchemy-asyncpg.git
synced 2025-08-26 16:40:40 +03:00
Merge pull request #141 from grillazz/refactor
refactor: simplify postgresql env vars
This commit is contained in:
commit
a5dff87330
9
.env
9
.env
@ -1,17 +1,10 @@
|
|||||||
PYTHONDONTWRITEBYTECODE=1
|
PYTHONDONTWRITEBYTECODE=1
|
||||||
PYTHONUNBUFFERED=1
|
PYTHONUNBUFFERED=1
|
||||||
|
|
||||||
SQL_DB=devdb
|
|
||||||
SQL_TEST_DB=testdb
|
|
||||||
SQL_HOST=db
|
|
||||||
SQL_USER=user
|
|
||||||
SQL_PASS=secret
|
|
||||||
|
|
||||||
# Postgres
|
# Postgres
|
||||||
POSTGRES_SERVER=db
|
POSTGRES_HOST=db
|
||||||
POSTGRES_PORT=5432
|
POSTGRES_PORT=5432
|
||||||
POSTGRES_DB=devdb
|
POSTGRES_DB=devdb
|
||||||
POSTGRES_TEST_DB=testdb
|
|
||||||
POSTGRES_USER=user
|
POSTGRES_USER=user
|
||||||
POSTGRES_PASSWORD=secret
|
POSTGRES_PASSWORD=secret
|
||||||
|
|
||||||
|
6
.github/workflows/build-and-test.yml
vendored
6
.github/workflows/build-and-test.yml
vendored
@ -18,9 +18,9 @@ jobs:
|
|||||||
env:
|
env:
|
||||||
PYTHONDONTWRITEBYTECODE: 1
|
PYTHONDONTWRITEBYTECODE: 1
|
||||||
PYTHONUNBUFFERED: 1
|
PYTHONUNBUFFERED: 1
|
||||||
SQL_DB: testdb
|
POSTGRES_DB: testdb
|
||||||
SQL_HOST: 127.0.0.1
|
POSTGRES_HOST: 127.0.0.1
|
||||||
SQL_USER: app-user
|
POSTGRES_USER: app-user
|
||||||
POSTGRES_PASSWORD: secret
|
POSTGRES_PASSWORD: secret
|
||||||
PGPASSWORD: secret
|
PGPASSWORD: secret
|
||||||
REDIS_HOST: 127.0.0.1
|
REDIS_HOST: 127.0.0.1
|
||||||
|
@ -21,10 +21,10 @@ class Settings(BaseSettings):
|
|||||||
JWT_ALGORITHM: str
|
JWT_ALGORITHM: str
|
||||||
JWT_EXPIRE: int
|
JWT_EXPIRE: int
|
||||||
|
|
||||||
SQL_USER: str
|
POSTGRES_USER: str
|
||||||
SQL_PASS: str
|
POSTGRES_PASSWORD: str
|
||||||
SQL_HOST: str
|
POSTGRES_HOST: str
|
||||||
SQL_DB: str
|
POSTGRES_DB: str
|
||||||
|
|
||||||
@computed_field
|
@computed_field
|
||||||
@property
|
@property
|
||||||
@ -57,20 +57,20 @@ class Settings(BaseSettings):
|
|||||||
|
|
||||||
The URL is built using the MultiHostUrl.build method, which takes the following parameters:
|
The URL is built using the MultiHostUrl.build method, which takes the following parameters:
|
||||||
- scheme: The scheme of the URL. In this case, it is "postgresql+asyncpg".
|
- scheme: The scheme of the URL. In this case, it is "postgresql+asyncpg".
|
||||||
- username: The username for the SQL database, retrieved from the SQL_USER environment variable.
|
- username: The username for the Postgres database, retrieved from the POSTGRES_USER environment variable.
|
||||||
- password: The password for the SQL database, retrieved from the SQL_PASS environment variable.
|
- password: The password for the Postgres database, retrieved from the POSTGRES_PASSWORD environment variable.
|
||||||
- host: The host of the SQL database, retrieved from the SQL_HOST environment variable.
|
- host: The host of the Postgres database, retrieved from the POSTGRES_HOST environment variable.
|
||||||
- path: The path of the SQL database, retrieved from the SQL_DB environment variable.
|
- path: The path of the Postgres database, retrieved from the POSTGRES_DB environment variable.
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
PostgresDsn: The constructed PostgresDsn URL for asyncpg.
|
PostgresDsn: The constructed PostgresDsn URL for asyncpg.
|
||||||
"""
|
"""
|
||||||
return MultiHostUrl.build(
|
return MultiHostUrl.build(
|
||||||
scheme="postgresql+asyncpg",
|
scheme="postgresql+asyncpg",
|
||||||
username=self.SQL_USER,
|
username=self.POSTGRES_USER,
|
||||||
password=self.SQL_PASS,
|
password=self.POSTGRES_PASSWORD,
|
||||||
host=self.SQL_HOST,
|
host=self.POSTGRES_HOST,
|
||||||
path=self.SQL_DB,
|
path=self.POSTGRES_DB,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
-- DROP DATABASE IF EXISTS devdb;
|
||||||
|
-- CREATE DATABASE devdb;
|
||||||
\connect devdb;
|
\connect devdb;
|
||||||
CREATE SCHEMA shakespeare;
|
CREATE SCHEMA shakespeare;
|
||||||
CREATE SCHEMA happy_hog;
|
CREATE SCHEMA happy_hog;
|
||||||
|
@ -3,9 +3,9 @@ version: '3.8'
|
|||||||
services:
|
services:
|
||||||
app:
|
app:
|
||||||
environment:
|
environment:
|
||||||
- SQL_DB=testdb
|
- POSTGRES_DB=testdb
|
||||||
|
|
||||||
db:
|
db:
|
||||||
environment:
|
environment:
|
||||||
- POSTGRES_USER=${SQL_USER}
|
- POSTGRES_USER=${POSTGRES_USER}
|
||||||
- SQL_DB=testdb
|
- POSTGRES_DB=testdb
|
@ -31,15 +31,16 @@ services:
|
|||||||
- fastapi_postgres_data:/var/lib/postgresql/data
|
- fastapi_postgres_data:/var/lib/postgresql/data
|
||||||
env_file:
|
env_file:
|
||||||
- .env
|
- .env
|
||||||
- .secrets
|
|
||||||
ports:
|
ports:
|
||||||
- 5432:5432
|
- 5432:5432
|
||||||
environment:
|
environment:
|
||||||
- POSTGRES_USER=${SQL_USER}
|
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD?Variable not set}
|
||||||
|
- POSTGRES_USER=${POSTGRES_USER?Variable not set}
|
||||||
|
- POSTGRES_DB=${POSTGRES_DB?Variable not set}
|
||||||
healthcheck:
|
healthcheck:
|
||||||
test:
|
test:
|
||||||
[
|
[
|
||||||
"CMD-SHELL", "pg_isready -d $SQL_DB -U $SQL_USER"
|
"CMD-SHELL", "pg_isready -d $POSTGRES_DB -U $POSTGRES_USER"
|
||||||
]
|
]
|
||||||
interval: 5s
|
interval: 5s
|
||||||
timeout: 5s
|
timeout: 5s
|
||||||
|
57
poetry.lock
generated
57
poetry.lock
generated
@ -68,17 +68,6 @@ six = ">=1.12.0"
|
|||||||
astroid = ["astroid (>=1,<2)", "astroid (>=2,<4)"]
|
astroid = ["astroid (>=1,<2)", "astroid (>=2,<4)"]
|
||||||
test = ["astroid (>=1,<2)", "astroid (>=2,<4)", "pytest"]
|
test = ["astroid (>=1,<2)", "astroid (>=2,<4)", "pytest"]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "async-timeout"
|
|
||||||
version = "4.0.3"
|
|
||||||
description = "Timeout context manager for asyncio programs"
|
|
||||||
optional = false
|
|
||||||
python-versions = ">=3.7"
|
|
||||||
files = [
|
|
||||||
{file = "async-timeout-4.0.3.tar.gz", hash = "sha256:4640d96be84d82d02ed59ea2b7105a0f7b33abe8703703cd0ab0bf87c427522f"},
|
|
||||||
{file = "async_timeout-4.0.3-py3-none-any.whl", hash = "sha256:7405140ff1230c310e51dc27b3145b9092d659ce68ff733fb0cefe3ee42be028"},
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "asyncpg"
|
name = "asyncpg"
|
||||||
version = "0.29.0"
|
version = "0.29.0"
|
||||||
@ -129,9 +118,6 @@ files = [
|
|||||||
{file = "asyncpg-0.29.0.tar.gz", hash = "sha256:d1c49e1f44fffafd9a55e1a9b101590859d881d639ea2922516f5d9c512d354e"},
|
{file = "asyncpg-0.29.0.tar.gz", hash = "sha256:d1c49e1f44fffafd9a55e1a9b101590859d881d639ea2922516f5d9c512d354e"},
|
||||||
]
|
]
|
||||||
|
|
||||||
[package.dependencies]
|
|
||||||
async-timeout = {version = ">=4.0.3", markers = "python_version < \"3.12.0\""}
|
|
||||||
|
|
||||||
[package.extras]
|
[package.extras]
|
||||||
docs = ["Sphinx (>=5.3.0,<5.4.0)", "sphinx-rtd-theme (>=1.2.2)", "sphinxcontrib-asyncio (>=0.3.0,<0.4.0)"]
|
docs = ["Sphinx (>=5.3.0,<5.4.0)", "sphinx-rtd-theme (>=1.2.2)", "sphinxcontrib-asyncio (>=0.3.0,<0.4.0)"]
|
||||||
test = ["flake8 (>=6.1,<7.0)", "uvloop (>=0.15.3)"]
|
test = ["flake8 (>=6.1,<7.0)", "uvloop (>=0.15.3)"]
|
||||||
@ -1582,9 +1568,6 @@ files = [
|
|||||||
{file = "redis-5.0.3.tar.gz", hash = "sha256:4973bae7444c0fbed64a06b87446f79361cb7e4ec1538c022d696ed7a5015580"},
|
{file = "redis-5.0.3.tar.gz", hash = "sha256:4973bae7444c0fbed64a06b87446f79361cb7e4ec1538c022d696ed7a5015580"},
|
||||||
]
|
]
|
||||||
|
|
||||||
[package.dependencies]
|
|
||||||
async-timeout = {version = ">=4.0.3", markers = "python_full_version < \"3.11.3\""}
|
|
||||||
|
|
||||||
[package.extras]
|
[package.extras]
|
||||||
hiredis = ["hiredis (>=1.0.0)"]
|
hiredis = ["hiredis (>=1.0.0)"]
|
||||||
ocsp = ["cryptography (>=36.0.1)", "pyopenssl (==20.0.1)", "requests (>=2.26.0)"]
|
ocsp = ["cryptography (>=36.0.1)", "pyopenssl (==20.0.1)", "requests (>=2.26.0)"]
|
||||||
@ -1707,28 +1690,28 @@ files = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "ruff"
|
name = "ruff"
|
||||||
version = "0.3.3"
|
version = "0.3.4"
|
||||||
description = "An extremely fast Python linter and code formatter, written in Rust."
|
description = "An extremely fast Python linter and code formatter, written in Rust."
|
||||||
optional = false
|
optional = false
|
||||||
python-versions = ">=3.7"
|
python-versions = ">=3.7"
|
||||||
files = [
|
files = [
|
||||||
{file = "ruff-0.3.3-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:973a0e388b7bc2e9148c7f9be8b8c6ae7471b9be37e1cc732f8f44a6f6d7720d"},
|
{file = "ruff-0.3.4-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:60c870a7d46efcbc8385d27ec07fe534ac32f3b251e4fc44b3cbfd9e09609ef4"},
|
||||||
{file = "ruff-0.3.3-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:cfa60d23269d6e2031129b053fdb4e5a7b0637fc6c9c0586737b962b2f834493"},
|
{file = "ruff-0.3.4-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:6fc14fa742e1d8f24910e1fff0bd5e26d395b0e0e04cc1b15c7c5e5fe5b4af91"},
|
||||||
{file = "ruff-0.3.3-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1eca7ff7a47043cf6ce5c7f45f603b09121a7cc047447744b029d1b719278eb5"},
|
{file = "ruff-0.3.4-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d3ee7880f653cc03749a3bfea720cf2a192e4f884925b0cf7eecce82f0ce5854"},
|
||||||
{file = "ruff-0.3.3-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e7d3f6762217c1da954de24b4a1a70515630d29f71e268ec5000afe81377642d"},
|
{file = "ruff-0.3.4-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:cf133dd744f2470b347f602452a88e70dadfbe0fcfb5fd46e093d55da65f82f7"},
|
||||||
{file = "ruff-0.3.3-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b24c19e8598916d9c6f5a5437671f55ee93c212a2c4c569605dc3842b6820386"},
|
{file = "ruff-0.3.4-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3f3860057590e810c7ffea75669bdc6927bfd91e29b4baa9258fd48b540a4365"},
|
||||||
{file = "ruff-0.3.3-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:5a6cbf216b69c7090f0fe4669501a27326c34e119068c1494f35aaf4cc683778"},
|
{file = "ruff-0.3.4-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:986f2377f7cf12efac1f515fc1a5b753c000ed1e0a6de96747cdf2da20a1b369"},
|
||||||
{file = "ruff-0.3.3-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:352e95ead6964974b234e16ba8a66dad102ec7bf8ac064a23f95371d8b198aab"},
|
{file = "ruff-0.3.4-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c4fd98e85869603e65f554fdc5cddf0712e352fe6e61d29d5a6fe087ec82b76c"},
|
||||||
{file = "ruff-0.3.3-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d6ab88c81c4040a817aa432484e838aaddf8bfd7ca70e4e615482757acb64f8"},
|
{file = "ruff-0.3.4-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:64abeed785dad51801b423fa51840b1764b35d6c461ea8caef9cf9e5e5ab34d9"},
|
||||||
{file = "ruff-0.3.3-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:79bca3a03a759cc773fca69e0bdeac8abd1c13c31b798d5bb3c9da4a03144a9f"},
|
{file = "ruff-0.3.4-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:df52972138318bc7546d92348a1ee58449bc3f9eaf0db278906eb511889c4b50"},
|
||||||
{file = "ruff-0.3.3-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:2700a804d5336bcffe063fd789ca2c7b02b552d2e323a336700abb8ae9e6a3f8"},
|
{file = "ruff-0.3.4-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:98e98300056445ba2cc27d0b325fd044dc17fcc38e4e4d2c7711585bd0a958ed"},
|
||||||
{file = "ruff-0.3.3-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:fd66469f1a18fdb9d32e22b79f486223052ddf057dc56dea0caaf1a47bdfaf4e"},
|
{file = "ruff-0.3.4-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:519cf6a0ebed244dce1dc8aecd3dc99add7a2ee15bb68cf19588bb5bf58e0488"},
|
||||||
{file = "ruff-0.3.3-py3-none-musllinux_1_2_i686.whl", hash = "sha256:45817af234605525cdf6317005923bf532514e1ea3d9270acf61ca2440691376"},
|
{file = "ruff-0.3.4-py3-none-musllinux_1_2_i686.whl", hash = "sha256:bb0acfb921030d00070539c038cd24bb1df73a2981e9f55942514af8b17be94e"},
|
||||||
{file = "ruff-0.3.3-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:0da458989ce0159555ef224d5b7c24d3d2e4bf4c300b85467b08c3261c6bc6a8"},
|
{file = "ruff-0.3.4-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:cf187a7e7098233d0d0c71175375c5162f880126c4c716fa28a8ac418dcf3378"},
|
||||||
{file = "ruff-0.3.3-py3-none-win32.whl", hash = "sha256:f2831ec6a580a97f1ea82ea1eda0401c3cdf512cf2045fa3c85e8ef109e87de0"},
|
{file = "ruff-0.3.4-py3-none-win32.whl", hash = "sha256:af27ac187c0a331e8ef91d84bf1c3c6a5dea97e912a7560ac0cef25c526a4102"},
|
||||||
{file = "ruff-0.3.3-py3-none-win_amd64.whl", hash = "sha256:be90bcae57c24d9f9d023b12d627e958eb55f595428bafcb7fec0791ad25ddfc"},
|
{file = "ruff-0.3.4-py3-none-win_amd64.whl", hash = "sha256:de0d5069b165e5a32b3c6ffbb81c350b1e3d3483347196ffdf86dc0ef9e37dd6"},
|
||||||
{file = "ruff-0.3.3-py3-none-win_arm64.whl", hash = "sha256:0171aab5fecdc54383993389710a3d1227f2da124d76a2784a7098e818f92d61"},
|
{file = "ruff-0.3.4-py3-none-win_arm64.whl", hash = "sha256:6810563cc08ad0096b57c717bd78aeac888a1bfd38654d9113cb3dc4d3f74232"},
|
||||||
{file = "ruff-0.3.3.tar.gz", hash = "sha256:38671be06f57a2f8aba957d9f701ea889aa5736be806f18c0cd03d6ff0cbca8d"},
|
{file = "ruff-0.3.4.tar.gz", hash = "sha256:f0f4484c6541a99862b693e13a151435a279b271cff20e37101116a21e2a1ad1"},
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -2268,5 +2251,5 @@ files = [
|
|||||||
|
|
||||||
[metadata]
|
[metadata]
|
||||||
lock-version = "2.0"
|
lock-version = "2.0"
|
||||||
python-versions = "^3.11"
|
python-versions = "^3.12"
|
||||||
content-hash = "6004dd5a71508cdb85a3155477fd26c09b656ddd7365c763691d7eb02bd2073f"
|
content-hash = "453a4f4415f5dde1de71d039dfed1bab2f5dcad2f42b916467e0997caebc3836"
|
||||||
|
@ -1,13 +1,13 @@
|
|||||||
[tool.poetry]
|
[tool.poetry]
|
||||||
name = "fastapi-sqlalchemy-asyncpg"
|
name = "fastapi-sqlalchemy-asyncpg"
|
||||||
version = "0.0.8"
|
version = "0.0.9"
|
||||||
description = ""
|
description = ""
|
||||||
authors = ["Jakub Miazek <the@grillazz.com>"]
|
authors = ["Jakub Miazek <the@grillazz.com>"]
|
||||||
packages = []
|
packages = []
|
||||||
license = "MIT"
|
license = "MIT"
|
||||||
|
|
||||||
[tool.poetry.dependencies]
|
[tool.poetry.dependencies]
|
||||||
python = "^3.11"
|
python = "^3.12"
|
||||||
fastapi = "0.110.0"
|
fastapi = "0.110.0"
|
||||||
pydantic = {version = "2.6.4", extras = ["email"]}
|
pydantic = {version = "2.6.4", extras = ["email"]}
|
||||||
pydantic-settings = "2.2.1"
|
pydantic-settings = "2.2.1"
|
||||||
@ -54,8 +54,8 @@ ignore = ["E501"]
|
|||||||
|
|
||||||
# Exclude a variety of commonly ignored directories.
|
# Exclude a variety of commonly ignored directories.
|
||||||
exclude = ["alembic",]
|
exclude = ["alembic",]
|
||||||
# Assume Python 3.10.
|
# Assume Python 3.11.
|
||||||
target-version = "py311"
|
target-version = "py312"
|
||||||
|
|
||||||
[tool.ruff.flake8-quotes]
|
[tool.ruff.flake8-quotes]
|
||||||
docstring-quotes = "double"
|
docstring-quotes = "double"
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
import pytest
|
import pytest
|
||||||
from httpx import AsyncClient
|
from httpx import AsyncClient, ASGITransport
|
||||||
|
|
||||||
from app.database import engine
|
from app.database import engine
|
||||||
from app.main import app
|
from app.main import app
|
||||||
@ -29,10 +29,16 @@ async def start_db():
|
|||||||
|
|
||||||
@pytest.fixture(scope="session")
|
@pytest.fixture(scope="session")
|
||||||
async def client(start_db) -> AsyncClient:
|
async def client(start_db) -> AsyncClient:
|
||||||
async with AsyncClient(
|
|
||||||
|
transport = ASGITransport(
|
||||||
app=app,
|
app=app,
|
||||||
|
|
||||||
|
)
|
||||||
|
async with AsyncClient(
|
||||||
|
# app=app,
|
||||||
base_url="http://testserver/v1",
|
base_url="http://testserver/v1",
|
||||||
headers={"Content-Type": "application/json"},
|
headers={"Content-Type": "application/json"},
|
||||||
|
transport=transport,
|
||||||
) as test_client:
|
) as test_client:
|
||||||
app.state.redis = await get_redis()
|
app.state.redis = await get_redis()
|
||||||
yield test_client
|
yield test_client
|
||||||
|
Loading…
x
Reference in New Issue
Block a user