Германия наработки апи жд и ээ - ссылки https://freeapis.io/transport-for-germany
https://habr.com/ru/articles/881814/
https://savinfirst.website.yandexcloud.net/templates/economy.html
https://newtechaudit.ru/python-dlya-analiza-rynka-czennyh-bumag/
https://savin.wallst.ru/flask_rzd.html
https://api.energy-charts.info/
Официальная справка
Про шардирование немного другой сервис
Managed Service for Sharded PostgreSQL
Есть
готовая БД по Германии
Схему ERD нарисовать и схему SQL
ЖД Германии
ЖД пристегнуть к этой же базе
Не забыть про Datalens - карту военных заводов , жд станции и ээ станции, например
Ранее у меня
API
На основе apigraph
Папка ruvdsfront2
Дёрнуть ээ и записать в БД
пока наверное так или с чатом мессенджера
trackcalend1
total_power
Prices
добавить несколько записей одним запросом
INSERT INTO authors (name) VALUES ('Aldous Huxley'), ('Ray Bradbury'), ('Kurt Vonnegut').
попытка вставить строку с уже существующим значением. В таком случае можно использовать конструкцию ON CONFLICT для обработки конфликтов (ограничений).
CREATE TABLE powerprice (timep TIMESTAMP PRIMARY KEY, fprice NUMERIC(6, 2) NOT NULL);
В скрипте (из API-запроса получен формат Unix-time
INSERT INTO powerprice (timep, fprice) VALUES (TO_TIMESTAMP(1763939700),70.96) ON CONFLICT (timep) DO NOTHING;
Да, ок, возвращает
[(datetime.datetime(2025, 11, 24, 2, 15), Decimal('70.96'))]
INSERT INTO powerprice (timep, fprice) VALUES (TO_TIMESTAMP(1763938800),80.12), (TO_TIMESTAMP(1763939700),70.96) ON CONFLICT (timep) DO NOTHING;
Да, ок, возвращает
[(datetime.datetime(2025, 11, 24, 2, 15), Decimal('70.96')), (datetime.datetime(2025, 11, 24, 2, 0), Decimal('80.12'))]
CREATE USER fulluser WITH PASSWORD 'pass' SUPERUSER;
В psql SET ROLE fulluser;
CREATE DATABASE germany25;
CREATE TABLE powerprice
(timep TIMESTAMP PRIMARY KEY, fprice NUMERIC(6, 2) NOT NULL);
INSERT INTO powerprice (timep, fprice)
VALUES (TO_TIMESTAMP(1763938800),80.12)
ON CONFLICT (timep) DO NOTHING;
Отсюда (пусть будет)
async def main(): ## создаем асинхронную функцию
conn = await asyncpg.connect (user='user', password='password', database='database', host='host') # подключаем к субд
# создание таблицы
await conn.execute('''
CREATE TABLE IF NOT EXISTS test_table (
id serial PRIMARY KEY,
name text NOT NULL
)
''')
# вставка данных в таблицу
await conn.execute('"
INSERT INTO test_table (name)
VALUES ($1)
''', 'John Doe')
# выборка данных из таблицы
result = await conn.fetch
('''
SELECT *
FROM test_table
''')
Делаю так
Подключение к базе данных PostgreSQL с помощью Python
import asyncio
import asyncpg
async def async_query_example():
# Подключение
conn = await asyncpg.connect('postgresql:// postgres:password@localhost:5432/mydb')
# Выполнение запроса
rows = await conn.fetch('SELECT * FROM users WHERE age > $1', 25)
for row in rows:
print(f"User: {row['name']}, Age: {row['age']}")
# Закрытие соединения
await conn.close()
# Запуск
asyncio.run(async_query_example())
оки, нет юзера fulluser в pg_hba.conf - ожидаемо
Отлично! Но нет точки с запятой нигде в запросах к БД! ?
С асинхроном еще разобраться, устаревший метод и т.д.
Про асинхрон для PostgreSQL
у меня
и здесь (в .т.ч. про устаревший способ ???)
async def main():
conn = await asyncpg.connect (host='178.253....)
asyncio.run(main())
1. async в Python используется для объявления асинхронной функции (корутины). Это позволяет выполнять задачи параллельно без блокировки выполнения основной программы.
async def function_name(): await some_async_function().
2. Await — позволяет приостановить выполнение асинхронной функции (корутины) до завершения ожидаемого объекта (например, ввода-вывода).
3. asyncio.run — функция в модуле asyncio в Python, которая запускает асинхронную функцию (корутину) через цикл событий (Event Loop).
Так?
host germany25 fulluser all trust
/etc/postgresql/16/main/pg_hba.conf
Было так

Ну уже лучше, теперь возврат из корутины не то что делает

Отдельно скрипт my_bda.py отрабатывает, но при вызове из основной проги - нет

всё внутрь?
Как здесь Вот пример реализации с библиотекой aiohttp в Flask:
Или вообще вынести my_bda2.py в отдельный контейнер. Ведь в этом ГЛАВНЫЙ смысл микросервсиной
Мой docker multistage 11.10.2025
онлайн vscode Там же 28.09.2025
Микросервисная архитектура на примере Python и gRPC
Установил онлайн VS Code и создал папку .home/myprojects/pricepower
Вывод из БД
на своей основе
Теперь скрипт в контейнер (по уроку от 28.09.25)
Открываю редактор
http://194.87.146.200:9090/?folder=/home/myprojects/ruvdsfront2v2
Расширение Python само собой
asyncpg хочет, но сначала
apt install python3-pip
apt install python3-asyncpg
Dockerfile
FROM python:3.10.13-alpine3.18
COPY . .
RUN pip install asyncio
RUN pip install asyncpg
CMD python app.py
Установка Docker
по уроку 2
docker build -t pricepower .

107 мб (попробовать мультистейдж)
из здесь
Операторы COPY, ADD и RUN добавляют новый слой к образу.
RUN pip install asyncio && pip install asyncpg
Ничего не изменилось
docker run -p 8081:80 pricepower
влёт

и закрылся
Думать как его сервером сделать
вызвать из фронта
По примеру из интернета
FROM python:3.10.13-alpine3.18 AS build
WORKDIR /app
RUN pip install asyncio
RUN pip install asyncpg
COPY . .
FROM python:3.10.13-alpine3.18
COPY --from=build /app .
CMD python app.py
Собирается, но при запуске контейнера пишет что нет asyncpg
отсюда
FROM python:3.10.13-alpine3.18
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
CMD ["python", "app.py"]
requirements.txt
asyncio
asyncpg
Ok, даже чуть поменьше - 101 и 24.8 МБ
Но multistage пока не получается, не берёт asyncpg
Простой клиент-сервер
Как работать с сокетами в Python?
и здесь
Немного в сторону
разобраться с этим
05.12.25
total_power как лучше добавить, целым или распарсить?
json берёт запись за день с шагом по времени, а можно добавлять по каждой отметке времени
Скользящее ли там время в запросе API?
два типа данных: json и jsonb
Хорошая статья!
Как работать с JSON в PostgreSQL
Тип json сохраняет данные в виде обычной текстовой строки.
Тип jsonb (binary JSON) — это уже структурированное представление. При сохранении данных PostgreSQL: парсит JSON и строит древовидную модель;
06.12.25
Таки структуру контейнеров - фронт (ruvdsfront3), функции(bda...) и раскидать по 3 машинам
шарды по
production_types
не, не получится - целая ведь запись
4-я таблица распарсена по виду
фронт выборка по дате и виду, умножить на цену, карту ээстанций, индекс мб
и в кубернет
Зазеркалье
или не timestamp а таки unix-формат?
Разработку на стринце
Клиент-сервер
Потом, когда контейнеры будут готовы, продолжить
https://savin.wallst.ru/my_kuber2.html
Кубернет