Легкий путь в Python
5.1K subscribers
97 photos
18 videos
3 files
155 links
Я — Алексей Яковенко, опытный разработчик Python. Здесь вы найдете статьи, заметки, посты и видео для прокачки навыков программирования 🐍 Интересное найдет и новичок, и профи 💡

📬По вопросам: https://t.me/yakvenalexx
🗣Сообщество: https://vk.cc/cxKNTb
Download Telegram
Гайд по основным методам ОРМ SQLAlchemy

Подготовил для вас небольшой гайд по основным методам работы с SQLAlchemy. Все примеры будут в синхронном подходе для удобства восприятия. Основной посыл показать вам, что в алхимии нет ничего сложного и освоить ее сможет каждый. Приступим.

Настройка работы с базой данных
from sqlalchemy.orm import sessionmaker
from sqlalchemy import create_engine
from your_model import YourModel

engine = create_engine('sqlite:///your_database.db')
Session = sessionmaker(bind=engine)
session = Session()


Основные методы

Получение всех записей
all_records = session.query(YourModel).all()


Получение записи по условию
record = session.query(YourModel).filter_by(id=1).first()


Изменение записи
record = session.query(YourModel).filter_by(id=1).first()
if record:
record.name = 'New Name'
session.commit()


Удаление записи
record = session.query(YourModel).filter_by(id=1).first()
if record:
session.delete(record)
session.commit()


Получение записей с условием
filtered_records = session.query(YourModel).filter(YourModel.age > 30).all()


Получение записей с сортировкой
sorted_records = session.query(YourModel).order_by(YourModel.name).all()


Ограничение количества записей
limited_records = session.query(YourModel).limit(10).all()


Обновление нескольких записей
session.query(YourModel).filter(YourModel.active == False).update({YourModel.active: True})
session.commit()


Удаление нескольких записей
session.query(YourModel).filter(YourModel.age < 18).delete()
session.commit()


Надеюсь, этот гайд будет полезен для вас! Если у вас есть вопросы или предложения, пишите в комментариях. Удачи в кодинге!
❤‍🔥13🔥9👍82
Приколисты)
😁12
Процесс по разработке бота на вебхуках с FastApi в самом разгаре. Хочу в будущей статье закрыть все вопросы по обмену данными между телеграмм и MiniApp. Ниже код HTML + CSS кому интересно
❤‍🔥9🔥8👍2
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>User Information</title>
<style>
body {
font-family: Arial, sans-serif;
margin: 40px;
background-color: #f0f0f0;
padding: 20px;
border-radius: 10px;
}

.user-info {
background-color: #fff;
padding: 20px;
border-radius: 10px;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
}

.user-info p {
font-size: 1.2em;
}
</style>
</head>
<body>

<h1>User Information</h1>
<div class="user-info">
<p id="user-id"></p>
<p id="username"></p>
<p id="first-name"></p>
<p id="last-name"></p>
</div>

<script src="https://telegram.org/js/telegram-web-app.js"></script>
<script>
document.addEventListener('DOMContentLoaded', function () {
const user = Telegram.WebApp.initDataUnsafe.user;

if (user) {
document.getElementById('user-id').textContent = 'User ID: ' + user.id;
document.getElementById('username').textContent = 'Username: ' + (user.username ? user.username : 'N/A');
document.getElementById('first-name').textContent = 'First Name: ' + (user.first_name ? user.first_name : 'N/A');
document.getElementById('last-name').textContent = 'Last Name: ' + (user.last_name ? user.last_name : 'N/A');
} else {
document.querySelector('.user-info').innerHTML = '<p>User data is not available.</p>';
}
});
</script>

</body>
</html>
🔥10❤‍🔥7👍41
Печальные новости. Ngrok тоже ушел с РФ и теперь работает только с VPN. Вы пользовались ним в своих проектах? Какую альтернативу выбираете?
😐5😢4😱3💔3👍1
🚀 Альтернатива Ngrok - Tuna 🚀

Нашел интересную альтернативу Ngrok, которая может быть полезна многим. Tuna - бесплатный и удобный сервис для создания туннелей. Вот гайд по установке на Windows:

1️⃣ Регистрация на сайте tuna.am для получения токена.
2️⃣ Установка через PowerShell:

С помощью winget:
winget install --id yuccastream.tuna


Вручную:
Invoke-WebRequest -Uri "https://releases.tuna.am/tuna/latest/tuna_windows_amd64.zip" -OutFile "$env:TEMP\tuna_windows_amd64.zip"
Expand-Archive -Path "$env:TEMP\tuna_windows_amd64.zip" -DestinationPath "$env:TEMP\tuna" -Force
Copy-Item -Path "$env:TEMP\tuna\tuna.exe" -Destination "$env:USERPROFILE\AppData\Local\Microsoft\WindowsApps" -Force


3️⃣ Проверка установки:
tuna help


4️⃣ Установка токена:
tuna config save-token tt_your_token


Эта команда сохранит токен, чтобы не указывать его каждый раз при запуске.

5️⃣ Пример использования:

tuna http 8080


Надеюсь, было полезно! Если у вас есть вопросы или предложения, пишите в комментариях. 📩
🔥12❤‍🔥54👍1
This media is not supported in your browser
VIEW IN TELEGRAM
Друзья, решил представить небольшое видео с демкой текущей версии моего проекта, который я готовлю для вас (своей будущей статьи на Хабре)!

На данный момент готово около 50% функционала, который я планирую реализовать. В основе проекта лежит приложение на FastAPI. Вместо использования Telegram MiniApp (их JavaScript-решения для отправки данных из окна), я решил разработать своё собственное, простое решение на базе FastAPI, с эндпоинтом для приема данных.

Подробнее обо всех возможностях и особенностях расскажу уже после завершения проекта.

А пока ознакомиться с исходным кодом текущей версии можно здесь: GitHub
🔥2016❤‍🔥7👍2👏1🐳1
GifDemo.gif
32.8 MB
Привет всем! Рад сообщить, что проект полностью завершен. Сегодня планирую начать писать статью по проекту. Если все пойдет по плану, статья будет опубликована в понедельник. Ссылка на исходник финальной версии проекта: GitHub
👍14🔥12👏64🤝1🆒1
Назревает что-то глобальное...😉
🔥26👍12❤‍🔥6😱21
​​🚀На Хабре вышла моя подробная статья о создании многофункционального Telegram-бота с использованием FastAPI. Это настоящий гайд "3 в 1", который научит вас объединять вебхуки, MiniApp и API методы в одном FastAPI-приложении.

Что вас ждет в статье:

Пошаговое руководство по созданию бота с нуля
Интеграция вебхуков, MiniApp и API методов
Практический пример бота для приема заявок с веб-интерфейсом
Бонус: мой подход к интеграции асинхронной SQLAlchemy в ботов

Ключевые моменты:

💎 Создание универсального FastAPI-приложения для бота
💎 Реализация вебхуков для мгновенной обработки сообщений
💎 Разработка MiniApp для удобного взаимодействия пользователей
💎 Использование API методов для расширенной функциональности

После изучения этого материала вы сможете легко создавать как простых ботов на вебхуках, так и сложные решения с веб-интерфейсом. Статья уже доступна на Хабре - обязательно ознакомьтесь и дайте знать, что думаете.

Ссылка на исходный код проекта, статью и работающего бота закреплены под этим постом.

Удачи в кодинге! 💻🤖
❤‍🔥20👍94🔥4🤩1
Вопросы и комментарии к статье "Telegram Web App, FastAPI и вебхуки в одном приложении: Создаем Telegram-бот с веб-интерфейсом для приема заявок" можно оставить в обсуждении. Надеюсь на вашу обратную связь, так как хочу понять насколько вам интересен такой формат публикаций. 👇👇👇
👌53🔥1
Друзья, я с небольшим анонсом. Подготовил для вас новую "болванку" (заготовку для разработки телеграмм ботов). Там новая структура и интегрирован расширенный модуль по универсальной работе с базой данных через алхимию.

Сегодня поделюсь исходником кода и дам к нему комментарии. И, скорее всего, под эту заготовку запишу видео обзор. Услышите хоть мой голос)
18🔥12👍8🥰1🦄1
🚀 Друзья, подготовил для вас профессиональный шаблон для разработки Telegram ботов на Python!

🔥 Этот шаблон — результат долгой работы и практического опыта. Он построен на современном стеке:

▫️ Aiogram 3
▫️ SQLAlchemy (async)
▫️ Alembic для миграций

🎯 Что внутри:

👉 Микросервисная архитектура для удобной разработки
👉 Готовая структура проекта
👉 Базовый класс для работы с БД (20+ готовых методов!)
👉 Продуманная система конфигурации

👨‍💻 Будет полезно тем, кто:

Разрабатывает коммерческие боты
Хочет писать чистый, поддерживаемый код
Ценит свое время и не хочет изобретать велосипед

📝 В планах записать подробный видео-обзор с инструкцией по работе с шаблоном. Разберем все фишки и покажу, как быстро создавать крутые боты!

⚡️ Ссылка на GitHub. Не забудьте поставить звездочку! Там описан подробный READ.ME по проекту. Не пропуcтите👇

🤔 Вопросы? Пишите в комментариях! Обсудим, подскажу, поможем друг другу!
🔥36❤‍🔥52👍2👎1👏1🙏1
🔍 Удобный инструмент для работы с Markdown

Нашел отличный бесплатный редактор для работы с Markdown-разметкой! 🎯

Что умеет:

✏️ Редактирование в двух режимах одновременно
👁 Мгновенный предпросмотр результата
📋 Удобное копирование готового кода

Где пригодится:


🤖 Форматирование текстов для Telegram-ботов
📝 Создание README.md для GitHub
📄 Оформление документации

🔗 Ссылка на редактор

Как работать:

Слева - текст с Markdown-разметкой
Справа - отформатированный результат
Редактируйте любую часть - изменения синхронизируются

💡 Удобно для тех, кто часто работает с форматированным текстом и не хочет запоминать все теги.
🔥15👍6🙏2
from sqlalchemy.orm import Mapped, mapped_column, relationship
from sqlalchemy import ForeignKey, Integer, BigInteger, Float
from sqlalchemy import Text, ARRAY
from typing import Optional, List
from app.database import Base


class Brand(Base):
__tablename__ = 'brands'

id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
name: Mapped[str] = mapped_column(Text, nullable=False)
description: Mapped[Optional[str]] = mapped_column(Text, nullable=True,
default='Без описания',
server_default='Описание не добавили')

# Связь 1 бренд -> много товаров
products: Mapped[List["Product"]] = relationship("Product", back_populates="brand")


class Product(Base):
__tablename__ = 'products'

id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
article: Mapped[int] = mapped_column(BigInteger, unique=True, nullable=False)
title: Mapped[Optional[str]]
description: Mapped[Optional[str]] = mapped_column(Text, nullable=True,
default='Без описания',
server_default='Описание не добавили')
barcodes: Mapped[Optional[List[str]]] = mapped_column(ARRAY(Text), nullable=True)

# Внешний ключ для связи с брендом
brand_id: Mapped[int] = mapped_column(ForeignKey('brands.id'))
brand: Mapped["Brand"] = relationship("Brand", back_populates="products")

# Связь 1 товар -> 1 цена
price: Mapped["Price"] = relationship("Price", uselist=False, back_populates="product")


class Price(Base):
__tablename__ = 'prices'

id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
value: Mapped[float] = mapped_column(Float, nullable=False)

# Внешний ключ для связи с товаром
product_id: Mapped[int] = mapped_column(ForeignKey('products.id'))
product: Mapped["Product"] = relationship("Product", back_populates="price")

Готовлю для вас пилотную статью, которая станет настоящим путеводителем в мире SQLAlchemy. Выше представлен фрагмент кода, в котором я описал модели таблиц в трех базовых связках

Вот что я планирую охватить:

1️⃣ Создание базового конфигурационного файла (Base) для работы с базами данных на SQLAlchemy. Мы рассмотрим, как подключаться к PostgreSQL и SQLite — двум самым популярным базам данных в проектах. 🛠

2️⃣ Описание моделей таблиц. Я подробно объясню, как создавать обычные колонки, а также покажу, как работать с более экзотическими типами данных, такими как Array и JSON. 📊

3️⃣ Связи между таблицами. Мы разберем непростую тему связей «один к одному», «один ко многим» и «многие к одному». Новички часто теряются в этой теме, поэтому я проведу вас за руку через все нюансы. 🤝

4️⃣ Работа с Alembic. Мы создадим наши модели таблиц со всеми необходимыми связями и миграциями. 🔄

Цикл публикаций будет ориентирован на использование ORM стиля. Я постараюсь максимально игнорировать Core, так как считаю, что при наличии высокоуровневого взаимодействия на Python нет смысла опускаться на более низкие уровни SQL.

Описывать буду только асинхронные методы, как для работы с Alembic, так и для взаимодействия с таблицами в дальнейшем. Подозреваю, что вы из-за этого не расстроитесь. 😉

Будет глобально и фундаментально 🚀

Как вам такой план?
🔥45❤‍🔥75👍4🤩2
class Product1S(Base):
# временные ссылки
link_1s: Mapped[str_or_none]
link_vendor: Mapped[str_or_none]
link_unit: Mapped[str_or_none]
link_nds: Mapped[str_or_none]

code: Mapped[str_or_none]
find_code: Mapped[str_or_none]
name: Mapped[str_or_none]
full_name: Mapped[str_or_none]
article: Mapped[str_or_none]
description: Mapped[description_an]
barcodes: Mapped[list[str] | None]

# связки по первичным ключам
brand_id: Mapped[int_or_none] = mapped_column(ForeignKey('brands.id'))
nds_id: Mapped[int_or_none] = mapped_column(ForeignKey('ndss.id'))
unit_id: Mapped[int_or_none] = mapped_column(ForeignKey('units.id'))
manufacture_id: Mapped[int_or_none] = mapped_column(ForeignKey('manufactures.id'))


Современный синтаксис SQLAlchemy в деле. Минимум телодвижений)
👍7🔥71👌1
Недавно столкнулся с интересной ситуацией в работе с Telegram ботом, и думаю, что такой кейс может быть полезен 💡

История такая:

Я разработал бота, который работает в системе автообновлений. Когда появляются изменения в основной ветке на GitHub, они автоматически подтягиваются и применяются к боту 🤖. Бот использует переменные окружения, хранящиеся в файле .env.

Бота писал пару месяцев назад и после над проектом работали другие разработчики. Со временем переменные изменялись, и появилась необходимость внести обновления. Проблема в том, что DevOps, который мог бы дать доступ к новым переменным, как назло, был в отпуске 🌴.

📌 Сложность: на руках был исходный код бота, но локально я его запустить не мог. Бот уже был запущен на сервере, и переиспользовать один и тот же токен нельзя. Никто, включая заказчика, не знал всех переменных наизусть 🤷‍♂️.

Как я вышел из ситуации:

1. Временно вынес токен бота прямо в основной файл, чтобы он подтягивался не из .env, а из кода (так делать не рекомендуется, но выхода не было) 🚨.

2. Локально разместил фейковые переменные, которые не касались нового функционала — основная задача была в том, чтобы не трогать рабочие данные.

3. Подставил битый токен для инициализации бота 🛠.

4. Запушил изменения на сервер (GitHub) 🚀.

Что получилось?


🤖 Бот на сервере упал, потому что использовал нерабочий токен. Зато все рабочие переменные остались на месте. Затем я поставил боевой токен локально и успешно запустил бота. Новый функционал не затронул старые переменные — всё продолжило работать!

💡 Вывод: даже если доступа к важным данным нет, можно найти решение. Надеюсь, этот кейс окажется полезным для вас!
10👍6🔥4🥰2👌1
Друзья, добрый вечер🙋

Решил подготовить для вас шпаргалку с самыми популярными командами GIT 🧑‍💻. Это 20 самых часто используемых команд, которые пригодятся как новичкам, так и опытным разработчикам.

1. Инициализация пустого репозитория 👇
git init


💡 Инициализирует новый Git-репозиторий в текущей директории.

2. Клонирование репозитория 👇
git clone <url>


💡 Клонирует существующий репозиторий на локальный компьютер.

3. Добавление удаленного репозитория👇
git remote add origin <url>


💡Добавляет удаленный репозиторий с именем origin.

4. Добавление файлов в отслеживание👇
git add <файл/директория>
git add .


💡Добавляет изменения в указанные файлы или директорию в область подготовки (staging area).
git add . — добавляет все измененные файлы.

5. Создание коммита👇
git commit -m "Сообщение коммита"


💡Создает коммит с указанным сообщением.

6. Отправка изменений на удаленный репозиторий👇
git push origin <branch>


💡 Отправляет локальные изменения на указанный удаленный репозиторий в указанную ветку.

7. Получение изменений с удаленного репозитория👇
git pull


💡Забирает последние изменения с удаленного репозитория и объединяет их с локальными.

8. Просмотр состояния репозитория👇
git status


💡Показывает текущее состояние репозитория, например, какие файлы были изменены или подготовлены к коммиту.

9. Просмотр истории коммитов👇
git log


💡Показывает историю коммитов в репозитории.

10. Создание новой ветки👇
git checkout -b <branch-name>


💡Создает новую ветку и сразу переключается на неё.

11. Переключение между ветками👇
git checkout <branch-name>


💡 Переключается на указанную ветку.

12. Слияние веток👇

git merge <branch-name>


💡 Сливает изменения из указанной ветки в текущую.

13. Отмена последнего коммита (оставляя изменения в файлах)👇

git reset --soft HEAD^


💡Отменяет последний коммит, сохраняя изменения в рабочих файлах.

14. Удаление локальной ветки👇
git branch -d <branch-name>


💡Удаляет локальную ветку.

15. Просмотр различий между файлами👇

git diff


💡Показывает изменения в файлах по сравнению с последним коммитом.

16. Просмотр всех веток👇
git branch


💡 Показывает список всех локальных веток.

17. Переименование текущей ветки👇
git branch -m <new-branch-name>


18. Переименование другой ветки👇
git branch -m <old-branch-name> <new-branch-name>


💡 Переименовывает указанную ветку.

19. Создание новой ветки и переключение на неё👇
git checkout -b <branch-name>

💡 Создает новую ветку и сразу переключается на неё.

20. Настройка ветки для автоматического пуша 👇

git push --set-upstream origin <branch-name>


💡 Связывает текущую ветку с удаленной, чтобы в дальнейшем можно было просто использовать git push без указания ветки.

_____

Сохраняйте пост, чтобы не потерять, и возвращайтесь к нему, когда нужно! Если у вас есть вопросы или дополнения, оставляйте их в комментариях👇

Не забудьте поставить лайк, если шпаргалка оказалась полезной 👍
21👍14🔥12
Это был нелегкий путь... 😅 Публикация планируется уже в эту субботу, 12 октября. 🗓 Статья получилась объёмная — около 30 минут чтения, но оно того стоит! 🔥
🔥27👍144❤‍🔥2🤩1
​​Друзья, доброе утро! 🌅

Опубликовал обещанную пилотную статью из мини-курса по асинхронной SQLAlchemy в стиле ORM! 🎉 В ней подробно раскрыл следующие темы:

📌 Основы SQLAlchemy: что это такое и как с ним работать
📌 Настройка проекта для работы с этим инструментом
📌 Детали моделей таблиц, как их описывать в современном стиле с использованием Mapped и mapped-column
📌 Связи между таблицами (один к одному, один ко многим, многие к одному) с примерами и объяснениями
📌 Alembic — создание и управление таблицами в асинхронном стиле и особенности миграций

Материала получилось много, но уверен, что после прочтения вопросов не останется. Статья рассчитана на разработчиков, которые планируют работать с табличными базами данных, такими как SQLite, PostgreSQL, MySQL и другие. Это сэкономит вам кучу времени при интеграции баз данных в проекты! 🧠

Статья написана на примере работы с PostgreSQL, но описанный код будет работать с любой базой данных. Кстати, я упомянул три способа развернуть PostgreSQL.

Буду рад вашей поддержке и обратной связи, так как написание таких материалов требует
🔥267❤‍🔥5👍3🥰2