It's been a while since I've posted an update for Rack Root, but I've actually made some progress on it lately.

I've finished my refactor to use SQLAlchemy for the database connections and also (finally) figured out how I want to join tables together and relate things.

I also changed some API endpoints. For example, if you look for /network/$id/gateway and there's no gateway, you get a 404. I also changed the UX around gateways. When you make a new network, there's no gateway assigned, so that part of the page has a green + icon. When you set a gateway, that icon is now a red delete icon. Those update the field and icon dynamically without having to refresh the whole page.

The new networks page also will look at the result and see if you got an HTTP 201. If so, you get redirected to the new page. Else, you get an error message. I'm not sure if I want to add more detail to that, it would require the frontend to parse and guess what went wrong. Maybe that's an assignment for another day.

Finally, there's a new Delete network button on the network detail page.

#rackroot #homelab #vuetify #fastapi #sqlalchemy #frontend #backend #fullstack #pytest

Anyone know how to do:

SELECT array(SELECT ...) AS arr, ...

with #SQLAlchemy? Or do I need to use text()? #Python #PostgreSQL

I think I finally have my SQLModel to SQLAlchemy refactor completed for Rack Root. As of now, I at least have all of my tests passing and typos worked out. I know I need to add some more join statements, but I'll do those as I come across them.

I still have a little bit of cleanup to do in removing commented code, fixing comments, organizing imports, and syncing this back to the main branch, but the hard part is done.

Then I can finally get back to the front end work. I've been on the backend side of things for what feels like months.

#sqlalchemy #fastapi #webdev #backend #databases #opensource #rackroot

⚙️Are you looking for an #online #database #modeling #tool with #SQL generation?

With the latest updates (e.g. modeling of #association #classes), BESSER is your ideal tool to #design and #generate your databases in many different "flavours" :

☑️ #SQLLite

☑️ #PostgresQL

☑️ #MySQL

☑️ #MariaDB

☑️ #MSSQLServer

☑️ and even #SQLAlchemy

Ready to give it a try? No installation required! ➡️ https://editor.besser-pearl.org/

Did I already mention is completely 🆓 and #opensource?

BESSER Web Modeling Editor

I am defining a #SQLAlchemy ORM and wish to use #JSON as column type. I can use the generic JSON type or the MS SQL Server-specific JSON type.
Whether I use the generic or the specific column type, values seem limited to 1000 characters (ODBC complains that larger contents would be truncated).
I try `mapped_column(JSON(4000))` in ORM definitions, but that does not seem to make any difference in practice.

What is the actual field width of this column type? Can I somehow change it (larger)?

FastAPI + Keycloak: Простая и безопасная авторизация в веб-приложении на примере реального проекта

Keycloak - это мощная open-source платформа для аутентификации и авторизации, которую используют даже банки и крупные корпоративные клиенты для защиты своих приложений и данных. В статье на реальном примере (FastAPI + Python) простым языком объясню, как Keycloak помогает упростить управление доступом и почему его принципы универсальны для любого бэкенда, независимо от выбранного языка программирования

https://habr.com/ru/companies/amvera/articles/907990/

#keycloak #fastapi #авторизация #базы_данных #python #keycloak_fastapi #вебразработка #sqlalchemy_20 #sqlalchemy #javascript

FastAPI + Keycloak: Простая и безопасная авторизация в веб-приложении на примере реального проекта

Друзья, приветствую! Давно хотел рассказать вам о такой замечательной open-source технологии, как Keycloak на примере реального веб-приложения. Сегодня я расскажу вам простым и доступным языком о том,...

Хабр

Boom!

In addition to our #MCP servers for #ODBC, #JDBC, #PyODBC, and #SQLAlchemy, we now have one for ADO.NET—bringing .NET runtime support into the mix.

At this point, we’ve covered all the major protocols needed to build data source–agnostic AI Agents via MCP.

Github Repo:

https://github.com/OpenLinkSoftware/mcp-adonet-server

GitHub - OpenLinkSoftware/mcp-adonet-server: C# based Model Context Procotol (MCP) Server for ADO.NET ODBC provider

C# based Model Context Procotol (MCP) Server for ADO.NET ODBC provider - GitHub - OpenLinkSoftware/mcp-adonet-server: C# based Model Context Procotol (MCP) Server for ADO.NET ODBC provider

GitHub

I have a #Python codebase using #sqlalchemy Core -- *NOT* ORM -- for its data layer, and I'm currently not happy with the way it's doing data for testing. Who has a pattern for this that they actually like?

I already have ephemeral per-test-function isolation of the database, so that's taken care of.

If this were ORM I'd just use something like factory-boy, but the fact that it's Core and doesn't really map neatly to objects the way ORM stuff does rules that out. I think ideally what I'd like is some sort of declarative JSON file format or whatever that lets me provide a mapping of table names to lists of rows to insert into them, and then a pytest fixture that lets me say "load that JSON file for this test". Has anyone written something like that? Do I get to go write my own?

애플리케이션 개발 측면에서 본 Drizzle ORM 대 Kysely 비교

https://hackers.pub/@hongminhee/2025/drizzle-orm-vs-kysely

애플리케이션 개발 측면에서 본 Drizzle ORM 대 Kysely 비교

TypeScript로 백엔드 서버를 개발하면서 적절한 ORM 선택은 항상 중요한 결정 중 하나입니다. 최근 제 프로젝트에서 Drizzle ORM과 Kysely를 모두 사용해 볼 기회가 있었는데, 개인적으로는 Drizzle ORM이 더 편리하고 생산성이 높았던 경험을 공유하고자 합니다.두 ORM에 대한 간략한 소개 Drizzle ORM은 TypeScript용 ORM으로, 타입 안전성과 직관적인 API를 강점으로 내세우고 있습니다. 스키마 정의부터 마이그레이션, 쿼리 빌더까지 풀스택 개발 경험을 제공합니다. Kysely는 “타입 안전한 SQL 쿼리 빌더”로 자신을 소개하며, 타입스크립트의 타입 시스템을 활용해 쿼리 작성 시 타입 안전성을 보장합니다. 두 도구 모두 훌륭하지만, 제 개발 경험에 비추어 볼 때 Drizzle ORM이 몇 가지 측면에서 더 편리했습니다.Drizzle ORM을 선호하게 된 이유 스키마 정의의 직관성 Drizzle ORM의 스키마 정의 방식은 매우 직관적이고 선언적입니다:import { pgTable, serial, text, integer } from 'drizzle-orm/pg-core';export const users = pgTable('users', { id: serial('id').primaryKey(), name: text('name').notNull(), email: text('email').unique().notNull(), age: integer('age')});<Drizzle ORM은 이 스키마 정의로부터 자동으로 CREATE TABLE SQL을 생성할 수 있어, 스키마와 코드가 항상 동기화되어 있습니다. 반면 Kysely는 타입 정의에 더 중점을 두고 있어 스키마와 타입 정의가 분리되는 경향이 있습니다:interface Database { users: { id: Generated<number>; name: string; email: string; age: number | null; };}<이 타입 정의는 TypeScript 코드에서 타입 안전성을 제공하지만, 이 타입 정의만으로는 CREATE TABLE SQL을 생성할 수 없다는 것이 결정적인 단점입니다. 실제로 테이블을 생성하려면 별도의 SQL 스크립트나 마이그레이션 코드를 작성해야 합니다. 이는 타입과 실제 데이터베이스 스키마 간의 불일치 가능성을 높입니다. Drizzle의 접근 방식이 데이터베이스 스키마와 TypeScript 타입을 더 긴밀하게 연결해주어 개발 과정에서 혼란을 줄여주었습니다.마이그레이션 경험 Drizzle ORM의 마이그레이션 도구(drizzle-kit)는 정말 인상적이었습니다. 스키마 변경사항을 자동으로 감지하고 SQL 마이그레이션 파일을 생성해주는 기능이 개발 워크플로우를 크게 개선했습니다:npx drizzle-kit generate:pg<이 명령어 하나로 스키마 변경사항에 대한 마이그레이션 파일이 생성되며, 이를 검토하고 적용하는 과정이 매우 간단했습니다. 반면 Kysely의 마이그레이션은 본질적으로 수동적입니다. 개발자가 직접 마이그레이션 파일을 작성해야 하며, 스키마 변경사항을 자동으로 감지하거나 SQL을 생성해주는 기능이 없습니다:// Kysely의 마이그레이션 예시async function up(db: Kysely<any>): Promise<void> { await db.schema .createTable('users') .addColumn('id', 'serial', (col) => col.primaryKey()) .addColumn('name', 'text', (col) => col.notNull()) .addColumn('email', 'text', (col) => col.unique().notNull()) .addColumn('age', 'integer') .execute();}async function down(db: Kysely<any>): Promise<void> { await db.schema.dropTable('users').execute();}<이러한 수동 방식은 복잡한 스키마 변경에서 실수할 가능성이 높아지고, 특히 큰 프로젝트에서는 작업량이 상당히 증가할 수 있었습니다. 하지만 Kysely의 마이그레이션에도 두 가지 중요한 장점이 있습니다:<TypeScript 기반 마이그레이션: Kysely의 마이그레이션 스크립트는 TypeScript로 작성되기 때문에, 마이그레이션 로직에 애플리케이션 로직을 통합할 수 있습니다. 예를 들어, S3와 같은 오브젝트 스토리지의 데이터도 함께 마이그레이트하는 복잡한 시나리오를 구현할 수 있습니다. 반면 Drizzle ORM은 SQL 기반 마이그레이션이므로 이러한 통합이 불가능합니다.<양방향 마이그레이션: Kysely는 up과 down 함수를 모두 정의하여 업그레이드와 다운그레이드를 모두 지원합니다. 이는 특히 팀 협업 환경에서 중요한데, 다른 개발자의 변경사항과 충돌이 발생할 경우 롤백이 필요할 수 있기 때문입니다. Drizzle ORM은 현재 업그레이드만 지원하며, 다운그레이드 기능이 없어 협업 시 불편할 수 있습니다.<참고로, Python 생태계의 SQLAlchemy 마이그레이션 도구인 Alembic은 훨씬 더 발전된 형태의 마이그레이션을 제공합니다. Alembic은 비선형적인 마이그레이션 경로(브랜치포인트 생성 가능)를 지원하여 복잡한 팀 개발 환경에서도 유연하게 대응할 수 있습니다. 이상적으로는 JavaScript/TypeScript 생태계의 ORM도 이러한 수준의 마이그레이션 도구를 제공하는 것이 바람직합니다.관계 설정의 용이성 Drizzle ORM에서 테이블 간 관계 설정이 매우 직관적이었습니다:import { relations } from 'drizzle-orm';export const usersRelations = relations(users, ({ one, many }) => ({ profile: one(profiles, { fields: [users.id], references: [profiles.userId], }), posts: many(posts)}));<이 방식은 데이터베이스 설계의 본질적인, 관계적인 측면을 명확하게 표현해주었습니다.쿼리 작성의 편의성과 동일 이름 칼럼 문제 처리 두 ORM 모두 쿼리 작성을 위한 API를 제공하지만, Drizzle의 접근 방식이 더 직관적이고 관계형 모델을 활용하기 쉬웠습니다:// Drizzle ORM - db.query 방식으로 관계 활용const result = await db.query.posts.findMany({ where: eq(posts.published, true), with: { user: true // 게시물 작성자 정보를 함께 조회 }});// 결과 접근이 직관적이고 타입 안전함console.log(result[0].title); // 게시물 제목console.log(result[0].user.name); // 작성자 이름 - 객체 구조로 명확하게 구분됨 console.log(result[0].user.id); // 작성자 ID - 게시물 ID와 이름이 같아도 문제 없음 // Kyselyconst result = await db .selectFrom('posts') .where('posts.published', '=', true) .leftJoin('users', 'posts.userId', 'users.id') .selectAll();// 결과 접근 시 칼럼 이름 충돌 문제console.log(result[0].id) // 오류: posts.id와 users.id 중 어떤 것인지 모호함 console.log(result[0].name) // 오류: 둘 다 name 칼럼이 있다면 모호함 <Drizzle의 접근 방식이 테이블과 컬럼을 참조할 때 타입 안전성을 더 강력하게 보장하고, 관계를 활용한 쿼리 작성이 더 직관적이었습니다. 특히 여러 테이블 조인 시 동일한 이름의 칼럼 처리 부분에서 Drizzle ORM이 훨씬 더 편리했습니다. 이는 제 개발 경험에서 가장 중요한 차이점 중 하나였습니다.// Drizzle ORM - 동일 이름 칼럼 처리const result = await db.query.posts.findMany({ with: { user: true // posts.id와 users.id가 모두 있지만 자동으로 구분됨 }});// 결과에 자연스럽게 접근 가능 console.log(result[0].id); // 게시물 ID console.log(result[0].user.id); // 사용자 ID - 명확하게 구분됨 console.log(result[0].user.name); // 사용자 이름 // Kysely - 동일 이름 칼럼 처리를 위해 별칭 필요const result = await db .selectFrom('posts') .leftJoin('users', 'posts.userId', 'users.id') .select([ 'posts.id as postId', // 별칭 필수 'posts.title', 'posts.content', 'users.id as userId', // 별칭 필수 'users.name as userName', // 칼럼 이름이 같을 수 있으므로 별칭 필수 'users.email as userEmail' // 일관성을 위해 모든 사용자 관련 칼럼에 접두어 필요 ]);// 별칭을 통한 접근console.log(result[0].postId); // 게시물 IDconsole.log(result[0].userId); // 사용자 IDconsole.log(result[0].userName); // 사용자 이름<Drizzle ORM은 테이블과 칼럼을 객체로 참조하기 때문에, 동일한 이름의 칼럼이 있어도 자연스럽게 계층 구조로 처리되며 타입 추론도 정확하게 작동합니다. 반면 Kysely에서는 문자열 기반 접근 방식 때문에 별칭을 수동으로 지정해야 하는 경우가 많았고, 복잡한 조인에서 이런 작업이 번거로워졌습니다. 특히 여러 테이블에 같은 이름의 칼럼이 많을수록 모든 칼럼에 명시적인 별칭을 지정해야 하는 불편함이 있었습니다. 또한 Drizzle ORM은 결과 타입을 자동으로 정확하게 추론해주어 별도의 타입 지정 없이도 안전하게 결과를 사용할 수 있었습니다.Kysely의 장점 물론 Kysely도 여러 강점이 있습니다:더 가벼운 구조: 필요한 기능만 포함할 수 있는 모듈화된 구조SQL에 더 가까운 접근: SQL 구문에 매우 충실한 API 설계유연성: 복잡한 쿼리에서 때로 더 유연한 작성이 가능<또한 앞서 언급했듯이, Kysely의 TypeScript 기반 마이그레이션과 양방향(up/down) 마이그레이션 지원은 특정 상황에서 Drizzle ORM보다 우위에 있는 기능입니다.SQLAlchemy와의 비교 및 앞으로의 기대 JavaScript/TypeScript 생태계의 ORM을 이야기하기 전에, 여러 언어 중에서도 Python의 SQLAlchemy는 특별한 위치를 차지합니다. 개인적으로 여태 사용해본 다양한 언어의 ORM 중에서 SQLAlchemy가 가장 기능이 풍부하고 강력하다고 느꼈습니다. 복잡한 쿼리 구성, 고급 관계 매핑, 트랜잭션 관리, 이벤트 시스템 등 SQLAlchemy의 기능은 정말 방대합니다. Drizzle ORM은 JavaScript 생태계에서 매우 인상적인 발전을 이루었지만, 아직 SQLAlchemy의 경지에는 이르지 못했다고 생각합니다. 특히 다음과 같은 부분에서 SQLAlchemy의 성숙도와 기능 풍부함이 돋보입니다:복잡한 서브쿼리와 윈도우 함수 지원다양한 이벤트 리스너와 훅다양한 상속 전략복잡한 트랜잭션 관리와 세션 관리대규모 프로젝트에서 검증된 안정성Alembic을 통한 비선형적 마이그레이션 지원놀라울 정도로 방대하고 상세한 문서화<결론 두 ORM 모두 훌륭한 도구이지만, 제 개발 스타일과 프로젝트 요구사항에는 Drizzle ORM이 더 잘 맞았습니다. 특히 스키마 정의의 직관성, 강력한 마이그레이션 도구, 그리고 전반적인 개발자 경험 측면에서 Drizzle ORM이 더 생산적인 개발을 가능하게 해주었습니다. 동일 이름 칼럼 처리와 같은 실질적인 문제에서 Drizzle ORM의 객체 기반 접근 방식이 가져다주는 편리함은 실제 프로젝트에서 큰 차이를 만들었습니다. ORM 선택은 결국 프로젝트 특성과 개인 선호도에 크게 좌우됩니다. 새로운 프로젝트를 시작한다면 두 도구 모두 간단히 테스트해보고 자신의 워크플로우에 더 적합한 것을 선택하는 것이 좋겠지만, 제 경우에는 Drizzle ORM이 명확한 승자였습니다. 앞으로 Drizzle ORM이 더욱 발전하여 SQLAlchemy 수준의 풍부한 기능과 유연성을 제공하게 되길 바랍니다. JavaScript/TypeScript 생태계에도 그런 수준의 강력한 ORM이 있으면 좋겠습니다. 다행히도 Drizzle ORM은 계속해서 발전하고 있으며, 그 발전 속도를 보면 기대가 큽니다. 여러분의 경험은 어떤가요? 다른 ORM 도구나 언어를 사용해보셨다면 의견을 공유해주세요!

Hackers' Pub

Создание анонимного чата в Telegram: Бот с MiniApp интерфейсом. Часть 1 — Бэкенд на FastAPI, Aiogram, Redis и Centrifugo

Это первая статья из цикла, посвященного разработке телеграм-бота с MiniApp для случайных чатов. В этой части мы сосредоточимся на создании бэкенда, используя современные технологии: FastAPI для разработки API, Redis для хранения данных в реальном времени и Centrifugo для обеспечения мгновенного взаимодействия между пользователями. Сегодня мы подробно разберем архитектуру проекта, настройку серверов и реализацию логики бота. В следующей статье мы переключимся на фронтенд и займемся разработкой MiniApp с использованием фреймворка Vue.js . Это позволит создать интуитивно понятный интерфейс для пользователей, где они смогут настраивать параметры поиска собеседника и общаться в режиме реального времени (Real time).

https://habr.com/ru/companies/amvera/articles/890976/

#fastapi #telegram_mini_app #telegram_webapp #python #centrifugo #centrifugo_v6 #sqlalchemy #redis #redis_python #бэкенд

Создание анонимного чата в Telegram: Бот с MiniApp интерфейсом. Часть 1 — Бэкенд на FastAPI, Aiogram, Redis и Centrifugo

Друзья, приветствую! Давно анонсировал большой проект, но из-за загруженности не доходили руки оформить все в статью. Как видите, руки наконец дошли. Напомню, что из анонса следовала разработка...

Хабр