Всем привет! 🚀 Не стал затягивать и спешу обрадовать вас: уже завтра выходит вторая часть статьи по асинхронной SQLAlchemy!
Что вас ждет в новой статье:
✅ Сессии и фабрики сессий: Поговорим о том, как управлять сессиями для взаимодействия с базой данных.
✅ Добавление данных в таблицы: Узнаем, как правильно и безопасно добавлять новые записи, обсудим метод flush и его отличие от commit.
✅ Извлечение данных из таблиц: Обретем уверенность в извлечении данных через select, используя фильтры (where, filter, filter_by).
✅ Разберем методы SQLAlchemy, такие как scalar, scalars, scalar_one_or_none, all, и научимся преобразовывать объекты SQLAlchemy в удобные словари Python с помощью Pydantic.
С исходным кодом второй части можно ознакомиться по ссылке: GitHub.
Не пропустите! 😉
Что вас ждет в новой статье:
✅ Сессии и фабрики сессий: Поговорим о том, как управлять сессиями для взаимодействия с базой данных.
✅ Добавление данных в таблицы: Узнаем, как правильно и безопасно добавлять новые записи, обсудим метод flush и его отличие от commit.
✅ Извлечение данных из таблиц: Обретем уверенность в извлечении данных через select, используя фильтры (where, filter, filter_by).
✅ Разберем методы SQLAlchemy, такие как scalar, scalars, scalar_one_or_none, all, и научимся преобразовывать объекты SQLAlchemy в удобные словари Python с помощью Pydantic.
С исходным кодом второй части можно ознакомиться по ссылке: GitHub.
Не пропустите! 😉
🔥18❤🔥8❤4
Друзья, доброе утро! ☀️ Обещанное продолжение в цикле публикаций про асинхронную SQLAlchemy уже вышло на Хабре и его можно почитать прямо сейчас. Статья получила название "Асинхронный SQLAlchemy 2: пошаговый гайд по управлению сессиями, добавлению и извлечению данных с Pydantic".
В ней я:
✅ Рассматриваю сессии и фабрики сессий — как эффективно управлять сессиями для взаимодействия с базой данных.
✅ Объясняю добавление данных в таблицы — безопасные методы добавления новых записей с использованием ORM-методов.
✅ Погружаюсь в извлечение данных из таблиц — от простых запросов до более сложных фильтров.
После прочтения этой статьи вы сможете уверенно работать с данными в любой табличной базе данных с помощью SQLAlchemy.
Надеюсь на вашу поддержку и комментарии, так как написание таких статей — задача не из простых. 😅 Ссылка на статью и исходный код, использованный в примерах, закреплены под постом. 📌
Приятного чтения и продуктивного дня! 😊
В ней я:
✅ Рассматриваю сессии и фабрики сессий — как эффективно управлять сессиями для взаимодействия с базой данных.
✅ Объясняю добавление данных в таблицы — безопасные методы добавления новых записей с использованием ORM-методов.
✅ Погружаюсь в извлечение данных из таблиц — от простых запросов до более сложных фильтров.
После прочтения этой статьи вы сможете уверенно работать с данными в любой табличной базе данных с помощью SQLAlchemy.
Надеюсь на вашу поддержку и комментарии, так как написание таких статей — задача не из простых. 😅 Ссылка на статью и исходный код, использованный в примерах, закреплены под постом. 📌
Приятного чтения и продуктивного дня! 😊
❤🔥18🔥7👍4❤3🥰1
Вопросы и обратную связь по статье "Асинхронный SQLAlchemy 2: пошаговый гайд по управлению сессиями, добавлению и извлечению данных с Pydantic" можно оставить ниже в комментариях👇
❤11
Друзья, рад представить большое обновление шаблона для разработки ботов на Aiogram 3 в связке с асинхронной SQLAlchemy.
В этом обновлении основной упор сделан на удобство, безопасность методов и гибкость кода. Вот что было изменено:
Ключевые изменения:
1) Отказ от использования **kwargs в базовом классе для работы с SQLAlchemy:
— Теперь методы принимают объекты Pydantic моделей, что делает код более структурированным и безопасным. Вместо передачи множества непредсказуемых аргументов через kwargs, данные фильтров передаются через строго типизированные модели.
— Для этого введен новый файл schemas.py, где описаны схемы Pydantic, которые используются для фильтрации и передачи данных.
Пример:
2) Изменения в базовом и дочерних классах для работы с данными SQLAlchemy:
— Теперь для работы с данными используются дженерики, что повышает типобезопасность и делает код более гибким.
— Это особенно полезно при работе с DAO-классами, обеспечивая более точную типизацию и предсказуемость в использовании моделей данных.
3) Декоратор @connection стал фабрикой декораторов:
— Теперь декоратор @connection принимает аргументы, что добавляет гибкости при настройке поведения сессии. В частности, появилась возможность задавать уровень изоляции транзакций через параметр isolation_level.
— Пример использования декоратора:
4) Пример использования новых методов:
— В методе обработки команды /start теперь используются Pydantic модели для фильтрации данных пользователя. Это делает код более понятным и устойчивым к ошибкам:
Зачем это было сделано:
— Безопасность: Использование Pydantic-моделей вместо kwargs повышает типобезопасность, помогает избежать ошибок и упрощает валидацию данных.
— Удобство: Дженерики и строгая типизация делают код более предсказуемым и удобным для работы, особенно при масштабировании проекта.
— Гибкость: Декоратор теперь может управлять сессией более детально, что позволяет гибко адаптировать уровень изоляции транзакци под различные сценарии.
В этом обновлении основной упор сделан на удобство, безопасность методов и гибкость кода. Вот что было изменено:
Ключевые изменения:
1) Отказ от использования **kwargs в базовом классе для работы с SQLAlchemy:
— Теперь методы принимают объекты Pydantic моделей, что делает код более структурированным и безопасным. Вместо передачи множества непредсказуемых аргументов через kwargs, данные фильтров передаются через строго типизированные модели.
— Для этого введен новый файл schemas.py, где описаны схемы Pydantic, которые используются для фильтрации и передачи данных.
Пример:
from pydantic import BaseModel, ConfigDict
class TelegramIDModel(BaseModel):
telegram_id: int
model_config = ConfigDict(from_attributes=True)
class UserModel(TelegramIDModel):
username: str | None
first_name: str | None
last_name: str | None
referral_id: str | None
2) Изменения в базовом и дочерних классах для работы с данными SQLAlchemy:
— Теперь для работы с данными используются дженерики, что повышает типобезопасность и делает код более гибким.
— Это особенно полезно при работе с DAO-классами, обеспечивая более точную типизацию и предсказуемость в использовании моделей данных.
3) Декоратор @connection стал фабрикой декораторов:
— Теперь декоратор @connection принимает аргументы, что добавляет гибкости при настройке поведения сессии. В частности, появилась возможность задавать уровень изоляции транзакций через параметр isolation_level.
— Пример использования декоратора:
def connection(isolation_level=None):
def decorator(method):
@wraps(method)
async def wrapper(*args, **kwargs):
async with async_session_maker() as session:
try:
if isolation_level:
await session.execute(text(f"SET TRANSACTION ISOLATION LEVEL {isolation_level}"))
return await method(*args, session=session, **kwargs)
except Exception as e:
await session.rollback()
raise e
finally:
await session.close()
return wrapper
return decorator
4) Пример использования новых методов:
— В методе обработки команды /start теперь используются Pydantic модели для фильтрации данных пользователя. Это делает код более понятным и устойчивым к ошибкам:
@user_router.message(CommandStart())
@connection()
async def cmd_start(message: Message, command: CommandObject, session, state: FSMContext, **kwargs):
await state.clear()
user_id = message.from_user.id
try:
user_info = await UserDAO.find_one_or_none(session=session, filters=TelegramIDModel(telegram_id=user_id))
if user_info:
await message.answer(GREETING_TEXT, reply_markup=start_keyboard())
return
ref_id = get_refer_id_or_none(command_args=command.args, user_id=user_id)
values = UserModel(telegram_id=user_id, username=message.from_user.username,
first_name=message.from_user.first_name, last_name=message.from_user.last_name,
referral_id=ref_id)
await UserDAO.add(session=session, values=values)
await message.answer(GREETING_TEXT, reply_markup=start_keyboard())
except Exception as e:
logger.error(f"Ошибка при выполнении команды /start для пользователя {user_id}: {e}")
await message.answer("Произошла ошибка при обработке вашего запроса. Пожалуйста, попробуйте снова позже.")
Зачем это было сделано:
— Безопасность: Использование Pydantic-моделей вместо kwargs повышает типобезопасность, помогает избежать ошибок и упрощает валидацию данных.
— Удобство: Дженерики и строгая типизация делают код более предсказуемым и удобным для работы, особенно при масштабировании проекта.
— Гибкость: Декоратор теперь может управлять сессией более детально, что позволяет гибко адаптировать уровень изоляции транзакци под различные сценарии.
🔥18❤5👍3🤔1
Ссылка на GitHub:
Все изменения уже доступны в репозитории: Ссылка на репозиторий. Жду ваших отзывов и предложений!
Все изменения уже доступны в репозитории: Ссылка на репозиторий. Жду ваших отзывов и предложений!
GitHub
GitHub - Yakvenalex/Aiogram3AlchemySample: Заготовка для разработки телеграмм ботов на Python, фреймворк Aiogram 3 в связке с асинхронной…
Заготовка для разработки телеграмм ботов на Python, фреймворк Aiogram 3 в связке с асинхронной SQLAlchemy - Yakvenalex/Aiogram3AlchemySample
🔥15❤4
Друзья, я с небольшим анонсом. Решил в своей незапланированной статье, которая, скорее всего, выйдет завтра подробно рассказать о таком супер-полезном инструменте Python, как Pydantic 2. Будете ждать?
Anonymous Poll
79%
Конечно!
19%
Ждать не буду, но в свободное время почитаю.
2%
Нет, мне это не интересно.
🔥9👍3🤩3❤1
Друзья, обещанная подробная статья про Pydantic уже опубликована на Хабре! 🎉
В ней я подробно рассмотрел Pydantic 2 - мощный инструмент для валидации данных в Python, который используется в более чем 30% всех Python-проектов.
Основные темы статьи:
• Что такое Pydantic и зачем он нужен
• Модели и поля в Pydantic
• Встроенные и кастомные механизмы валидации
• Автогенерируемые поля
• Настройка моделей через ConfigDict
• Наследование моделей
• Интеграция с ORM (на примере SQLAlchemy)
• Преобразование данных в словари и JSON
Статья подойдет как новичкам, так и опытным разработчикам. Вы узнаете, как применять Pydantic 2 в своих проектах и почему он стал неотъемлемой частью экосистемы Python.
Ссылка на статью: Pydantic 2: Полное руководство для Python-разработчиков — от основ до продвинутых техник
Приятного чтения! Буду рад вашим комментариям и вопросам. 👨💻📚
В ней я подробно рассмотрел Pydantic 2 - мощный инструмент для валидации данных в Python, который используется в более чем 30% всех Python-проектов.
Основные темы статьи:
• Что такое Pydantic и зачем он нужен
• Модели и поля в Pydantic
• Встроенные и кастомные механизмы валидации
• Автогенерируемые поля
• Настройка моделей через ConfigDict
• Наследование моделей
• Интеграция с ORM (на примере SQLAlchemy)
• Преобразование данных в словари и JSON
Статья подойдет как новичкам, так и опытным разработчикам. Вы узнаете, как применять Pydantic 2 в своих проектах и почему он стал неотъемлемой частью экосистемы Python.
Ссылка на статью: Pydantic 2: Полное руководство для Python-разработчиков — от основ до продвинутых техник
Приятного чтения! Буду рад вашим комментариям и вопросам. 👨💻📚
Хабр
Pydantic 2: Полное руководство для Python-разработчиков — от основ до продвинутых техник
Недавно я обратил внимание, что в русскоязычном интернете очень мало доступной и понятной информации о библиотеке Pydantic, особенно об её обновлённой версии 2. Это кажется странным, потому что...
🔥21👍5❤🔥3❤2
Упрощенное тестирование Pydantic с имитацией ORM
При изучении Pydantic по моей статье, вы можете столкнуться с необходимостью тестирования метода model_validate(my_obj, from_attributes=True). Чтобы избежать развертывания отдельной базы данных с описанием модели таблицы SQLAlchemy, можно использовать следующий элегантный подход:
1. Создание имитации ORM-класса
Создайте простой класс, имитирующий ORM-модель. Например:
2. Определение Pydantic-модели
Создайте соответствующую Pydantic-модель. Например:
3. Использование модели
Теперь вы можете использовать вашу "ORM-модель" с Pydantic:
Результат
Почему это работает
Этот подход эффективен благодаря мощи объектно-ориентированного программирования в Python. Создавая простой класс MyUser, вы фактически имитируете поведение ORM-модели. Pydantic способен работать с этим классом так же, как он работал бы с реальной ORM-моделью, извлекая атрибуты и применяя свою логику валидации и преобразования.
Такой метод позволяет легко тестировать и демонстрировать функциональность Pydantic без необходимости настройки полноценной базы данных, что особенно удобно для обучения и быстрого прототипирования.
При изучении Pydantic по моей статье, вы можете столкнуться с необходимостью тестирования метода model_validate(my_obj, from_attributes=True). Чтобы избежать развертывания отдельной базы данных с описанием модели таблицы SQLAlchemy, можно использовать следующий элегантный подход:
1. Создание имитации ORM-класса
Создайте простой класс, имитирующий ORM-модель. Например:
from datetime import date
class MyUser:
id = 3
name = "Алексей"
surname = "Яковенко"
birthday_date = date(1993, 2, 19)
2. Определение Pydantic-модели
Создайте соответствующую Pydantic-модель. Например:
from pydantic import BaseModel, computed_field
from dateutil.relativedelta import relativedelta
class User(BaseModel):
id: int
name: str
surname: str
birthday_date: date
@computed_field
def full_name(self) -> str:
return f"{self.name} {self.surname}"
@computed_field
def age(self) -> str:
today = date.today()
delta = relativedelta(today, self.birthday_date)
return f"{delta.years} лет, {delta.months} месяцев и {delta.days} дней"
3. Использование модели
Теперь вы можете использовать вашу "ORM-модель" с Pydantic:
my_obj = MyUser()
alex = User.model_validate(my_obj, from_attributes=True)
print(alex.model_dump())
Результат
{
'id': 3,
'name': 'Алексей',
'surname': 'Яковенко',
'birthday_date': datetime.date(1993, 2, 19),
'full_name': 'Алексей Яковенко',
'age': '31 лет, 7 месяцев и 29 дней'
}Почему это работает
Этот подход эффективен благодаря мощи объектно-ориентированного программирования в Python. Создавая простой класс MyUser, вы фактически имитируете поведение ORM-модели. Pydantic способен работать с этим классом так же, как он работал бы с реальной ORM-моделью, извлекая атрибуты и применяя свою логику валидации и преобразования.
Такой метод позволяет легко тестировать и демонстрировать функциональность Pydantic без необходимости настройки полноценной базы данных, что особенно удобно для обучения и быстрого прототипирования.
🔥14👍7❤🔥4🥰2❤1
Друзья, я с анонсом нового проекта Telegram-бота в связке с MiniApp. На этот раз бот будет уметь: генерировать QR-коды, сканировать их, используя камеру смартфона и считывать данные с QR-кода после отправки фото.
Базовый функционал уже готов. Осталось это дело прикрутить к боту.
Будете ждать статью о создании такого проекта на Хабре?
Базовый функционал уже готов. Осталось это дело прикрутить к боту.
Будете ждать статью о создании такого проекта на Хабре?
👍35🔥11❤🔥4❤2🤩2
Друзья, решил поделиться с вами универсальным методом получения UserID пользователя в приложениях Telegram-ботов с MiniApp. Этот подход позволит получить UserID из командного меню, текстовых и инлайн кнопок.
1. Выполняем импорт JS TelegramWEBApp
2. Пишем функцию
- Сначала она пытается получить ID из объекта Telegram Web App, что работает для командного меню и инлайн-кнопок.
- Если первый метод не сработал, функция ищет параметр 'user_id' в URL, что позволяет передавать ID через текстовые кнопки (не забудьте только подставить параметр запроса, чтоб получилась ссылка такого вида: https://your_site.ru?user_id=12345).
- Если оба метода не дали результата, функция выбрасывает ошибку.
1. Выполняем импорт JS TelegramWEBApp
<script src="https://telegram.org/js/telegram-web-app.js"></script>
2. Пишем функцию
async function getUserID() {
const tg = window.Telegram.WebApp;
if (tg.initDataUnsafe?.user?.id) {
console.log("User data from Telegram:", JSON.stringify(tg.initDataUnsafe.user));
return tg.initDataUnsafe.user.id;
}
const urlParams = new URLSearchParams(window.location.search);
const userID = urlParams.get('user_id');
if (userID) {
console.log("User ID from URL:", userID);
return userID;
}
throw new Error("User ID not available");
}- Сначала она пытается получить ID из объекта Telegram Web App, что работает для командного меню и инлайн-кнопок.
- Если первый метод не сработал, функция ищет параметр 'user_id' в URL, что позволяет передавать ID через текстовые кнопки (не забудьте только подставить параметр запроса, чтоб получилась ссылка такого вида: https://your_site.ru?user_id=12345).
- Если оба метода не дали результата, функция выбрасывает ошибку.
❤10🔥9👍6❤🔥4
Media is too big
VIEW IN TELEGRAM
Проект QRCodeMaster наконец-то готов! В ходе разработки пришлось пересмотреть несколько подходов, но теперь я полностью доволен результатом.
Бот представляет собой MiniApp + Telegram-бота с функциями:
📷 Сканирование QR-кодов в реальном времени через камеру.
📤 Распознавание QR-кодов на загруженных изображениях.
✨ Создание новых QR-кодов с возможностью кастомизации.
Как и в предыдущем проекте, всё работает в одном приложении на FastAPI, которое использует вебхуки для высокой скорости обработки запросов. В боте я использовал две JavaScript библиотеки:
jsQR — для сканирования QR-кодов через камеру и загрузку изображений.
EasyQRCodeJS — для генерации QR-кодов.
Проект уже доступен на GitHub, а бота можно протестировать здесь: @qr_code_masterBOT.
К среде постараюсь выложить на Хабре подробную статью о разработке с детальным описанием всех этапов.
Бот представляет собой MiniApp + Telegram-бота с функциями:
📷 Сканирование QR-кодов в реальном времени через камеру.
📤 Распознавание QR-кодов на загруженных изображениях.
✨ Создание новых QR-кодов с возможностью кастомизации.
Как и в предыдущем проекте, всё работает в одном приложении на FastAPI, которое использует вебхуки для высокой скорости обработки запросов. В боте я использовал две JavaScript библиотеки:
jsQR — для сканирования QR-кодов через камеру и загрузку изображений.
EasyQRCodeJS — для генерации QR-кодов.
Проект уже доступен на GitHub, а бота можно протестировать здесь: @qr_code_masterBOT.
К среде постараюсь выложить на Хабре подробную статью о разработке с детальным описанием всех этапов.
👍20🔥9❤4👏2
Please open Telegram to view this post
VIEW IN TELEGRAM
❤24🔥8❤🔥6👍5🍾3🏆2👏1💯1
Планирую подготовить для вас новую заготовку для разработки FastApi или телеграмм ботов, как прошлую. Какую "балванку" вы бы хотели получить?
Final Results
57%
FastApi + SQLAlchemy + авторизация
10%
Aiogram + SQLAlchemy + webhook (как старая, но на вебхуках)
33%
Aiogram + SQLAlchemy + webhook + MiniApp
👍12
Друзья, доброе утро! ☀️
Я рад представить вам новую статью на Хабре, где я подробно разобрал проект Telegram-бота с вебхуками и MiniApp, обслуживаемого на FastAPI. В этот раз я постарался максимально упростить подачу материала, сосредоточив внимание на самой теме статьи. 📚
Проект представляет собой бота, который умеет генерировать QR-коды, сканировать их с камеры устройства в реальном времени, а также работать с QR-кодами, загруженными с фото. 🎥📱 Информация, сгенерированная ботом (QR-код или данные с отсканированного кода), возвращается пользователю прямо в бота.
Особое внимание в статье я уделил передаче данных между ботом и MiniApp. После прочтения у вас точно не останется вопросов о том, как получить информацию о пользователе на странице MiniApp и отправить её обратно в бот, независимо от способа входа. 🔄
Из новинок вы также узнаете, как отправлять медиа с помощью Aiogram 3, используя Base64 строки, и работать с BuferInputFile. 🛠
Проект получился действительно интересным, так что не пропустите! 😉
Ссылку на статью, проект на GitHub и на работающего бота закрепил под этим постом. 🤖
С нетерпением жду ваши отзывы и комментарии! ✉️
Я рад представить вам новую статью на Хабре, где я подробно разобрал проект Telegram-бота с вебхуками и MiniApp, обслуживаемого на FastAPI. В этот раз я постарался максимально упростить подачу материала, сосредоточив внимание на самой теме статьи. 📚
Проект представляет собой бота, который умеет генерировать QR-коды, сканировать их с камеры устройства в реальном времени, а также работать с QR-кодами, загруженными с фото. 🎥📱 Информация, сгенерированная ботом (QR-код или данные с отсканированного кода), возвращается пользователю прямо в бота.
Особое внимание в статье я уделил передаче данных между ботом и MiniApp. После прочтения у вас точно не останется вопросов о том, как получить информацию о пользователе на странице MiniApp и отправить её обратно в бот, независимо от способа входа. 🔄
Из новинок вы также узнаете, как отправлять медиа с помощью Aiogram 3, используя Base64 строки, и работать с BuferInputFile. 🛠
Проект получился действительно интересным, так что не пропустите! 😉
Ссылку на статью, проект на GitHub и на работающего бота закрепил под этим постом. 🤖
С нетерпением жду ваши отзывы и комментарии! ✉️
🔥28❤🔥6👍6❤3🎉2💯2👏1👻1
Оставить комментарии к статье "Создание Telegram Web App с FastAPI: Генерация, сканирование QR-кодов камерой устройства и деплой за 5 минут" можно тут👇
У меня уже давно лежит исходник игры 2048. HTML + CSS + пару JavaScript библиотек. Подумал о том, что можно было бы прикрутить эту легендарную игру к телеграмм боту.
Концепт такой. В боте можно будет смотреть свой рекорд + список рекордов других игроков (топ-10). Прикрутим к этому делу базу данных.
А в самой игре как на скрине будет.
То есть. Полноценный телеграмм бот-игра. Хотели бы чтоб я сделал такой проект, а потом рассказал как такое пишется?
Концепт такой. В боте можно будет смотреть свой рекорд + список рекордов других игроков (топ-10). Прикрутим к этому делу базу данных.
А в самой игре как на скрине будет.
То есть. Полноценный телеграмм бот-игра. Хотели бы чтоб я сделал такой проект, а потом рассказал как такое пишется?
👍54🔥8❤5