[{"data":1,"prerenderedAt":1013},["ShallowReactive",2],{"page-\u002Fasync-engines-dialects-and-connection-pooling\u002Fintegrating-sqlalchemy-async-with-fastapi-and-starlette\u002Ffixing-greenletspawnerror-in-async-sqlalchemy-workflows\u002F":3},{"id":4,"title":5,"body":6,"description":170,"extension":1007,"meta":1008,"navigation":223,"path":1009,"seo":1010,"stem":1011,"__hash__":1012},"content\u002Fasync-engines-dialects-and-connection-pooling\u002Fintegrating-sqlalchemy-async-with-fastapi-and-starlette\u002Ffixing-greenletspawnerror-in-async-sqlalchemy-workflows\u002Findex.md","Fixing GreenletSpawnError in Async SQLAlchemy Workflows",{"type":7,"value":8,"toc":994},"minimark",[9,13,18,30,103,107,126,135,139,152,157,164,363,367,378,465,469,476,567,571,579,733,737,740,805,809,930,934,949,965,976,990],[10,11,5],"h1",{"id":12},"fixing-greenletspawnerror-in-async-sqlalchemy-workflows",[14,15,17],"h2",{"id":16},"direct-answer-immediate-resolution-steps","Direct Answer: Immediate Resolution Steps",[19,20,21,25,26,29],"p",{},[22,23,24],"code",{},"GreenletSpawnError"," occurs when synchronous SQLAlchemy operations attempt to execute inside an active ",[22,27,28],{},"asyncio"," event loop. Resolve it immediately by:",[31,32,33,57,76,89],"ol",{},[34,35,36,40,41,44,45,48,49,52,53,56],"li",{},[37,38,39],"strong",{},"Identify the trigger:"," Locate any synchronous ",[22,42,43],{},"Session",", ",[22,46,47],{},"create_engine",", or blocking ",[22,50,51],{},".execute()"," calls invoked from ",[22,54,55],{},"async def"," functions.",[34,58,59,62,63,65,66,69,70,65,72,75],{},[37,60,61],{},"Migrate to native async primitives:"," Replace ",[22,64,47],{}," with ",[22,67,68],{},"create_async_engine"," and ",[22,71,43],{},[22,73,74],{},"AsyncSession",".",[34,77,78,81,82,85,86,75],{},[37,79,80],{},"Bridge unavoidable sync code:"," Wrap legacy or third-party blocking operations using ",[22,83,84],{},"await session.run_sync()"," or ",[22,87,88],{},"asyncio.to_thread()",[34,90,91,94,95,98,99,102],{},[37,92,93],{},"Verify dependency compatibility:"," Ensure ",[22,96,97],{},"greenlet>=1.1.0"," is installed and matches your Python ",[22,100,101],{},"3.8+"," runtime.",[14,104,106],{"id":105},"root-cause-analysis-event-loop-blocking-and-greenlet-spawning","Root Cause Analysis: Event Loop Blocking and Greenlet Spawning",[19,108,109,110,113,114,116,117,119,120,122,123,125],{},"SQLAlchemy's async compatibility layer relies on ",[22,111,112],{},"greenlet"," to transparently execute synchronous DBAPI drivers within an ",[22,115,28],{}," event loop. When a synchronous database call is detected, ",[22,118,112],{}," attempts to spawn a micro-thread to handle the blocking I\u002FO without halting the loop. If the event loop is already running, ",[22,121,112],{}," cannot safely yield control, raising ",[22,124,24],{}," to prevent event loop corruption and undefined state.",[19,127,128,129,134],{},"This exception highlights an architectural mismatch: traditional blocking drivers expect a dedicated OS thread, while modern async I\u002FO patterns require non-blocking, cooperative scheduling. Understanding driver-level async support and how dialects translate queries to async sockets is essential; review ",[130,131,133],"a",{"href":132},"\u002Fasync-engines-dialects-and-connection-pooling\u002F","Async Engines, Dialects, and Connection Pooling"," to grasp how asyncpg, aiosqlite, and asyncmy bypass the greenlet fallback entirely.",[14,136,138],{"id":137},"step-by-step-migration-to-fully-async-workflows","Step-by-Step Migration to Fully Async Workflows",[19,140,141,142,44,144,147,148,151],{},"Transitioning from synchronous to fully async SQLAlchemy requires strict boundary enforcement. Audit your codebase for ",[22,143,47],{},[22,145,146],{},"Session()",", and direct ",[22,149,150],{},".commit()"," calls. Replace them with the following production-safe patterns.",[153,154,156],"h3",{"id":155},"_1-correct-async-engine-session-initialization","1. Correct Async Engine & Session Initialization",[19,158,159,160,163],{},"Initialize the engine and session factory using SQLAlchemy 2.0 async primitives. Explicitly disable ",[22,161,162],{},"expire_on_commit"," to prevent lazy-loading attempts that trigger greenlet spawning.",[165,166,171],"pre",{"className":167,"code":168,"language":169,"meta":170,"style":170},"language-python shiki shiki-themes github-light github-dark","from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession\nfrom sqlalchemy.orm import sessionmaker\nfrom typing import AsyncGenerator\n\nDATABASE_URL = \"postgresql+asyncpg:\u002F\u002Fuser:pass@localhost\u002Fdb\"\n\nengine = create_async_engine(\n DATABASE_URL, \n pool_size=10, \n max_overflow=5, \n pool_pre_ping=True\n)\n\nasync_session_factory = sessionmaker(\n bind=engine, \n class_=AsyncSession, \n expire_on_commit=False\n)\n","python","",[22,172,173,192,205,218,225,239,244,256,265,279,292,303,309,314,325,336,347,358],{"__ignoreMap":170},[174,175,178,182,186,189],"span",{"class":176,"line":177},"line",1,[174,179,181],{"class":180},"szBVR","from",[174,183,185],{"class":184},"sVt8B"," sqlalchemy.ext.asyncio ",[174,187,188],{"class":180},"import",[174,190,191],{"class":184}," create_async_engine, AsyncSession\n",[174,193,195,197,200,202],{"class":176,"line":194},2,[174,196,181],{"class":180},[174,198,199],{"class":184}," sqlalchemy.orm ",[174,201,188],{"class":180},[174,203,204],{"class":184}," sessionmaker\n",[174,206,208,210,213,215],{"class":176,"line":207},3,[174,209,181],{"class":180},[174,211,212],{"class":184}," typing ",[174,214,188],{"class":180},[174,216,217],{"class":184}," AsyncGenerator\n",[174,219,221],{"class":176,"line":220},4,[174,222,224],{"emptyLinePlaceholder":223},true,"\n",[174,226,228,232,235],{"class":176,"line":227},5,[174,229,231],{"class":230},"sj4cs","DATABASE_URL",[174,233,234],{"class":180}," =",[174,236,238],{"class":237},"sZZnC"," \"postgresql+asyncpg:\u002F\u002Fuser:pass@localhost\u002Fdb\"\n",[174,240,242],{"class":176,"line":241},6,[174,243,224],{"emptyLinePlaceholder":223},[174,245,247,250,253],{"class":176,"line":246},7,[174,248,249],{"class":184},"engine ",[174,251,252],{"class":180},"=",[174,254,255],{"class":184}," create_async_engine(\n",[174,257,259,262],{"class":176,"line":258},8,[174,260,261],{"class":230}," DATABASE_URL",[174,263,264],{"class":184},", \n",[174,266,268,272,274,277],{"class":176,"line":267},9,[174,269,271],{"class":270},"s4XuR"," pool_size",[174,273,252],{"class":180},[174,275,276],{"class":230},"10",[174,278,264],{"class":184},[174,280,282,285,287,290],{"class":176,"line":281},10,[174,283,284],{"class":270}," max_overflow",[174,286,252],{"class":180},[174,288,289],{"class":230},"5",[174,291,264],{"class":184},[174,293,295,298,300],{"class":176,"line":294},11,[174,296,297],{"class":270}," pool_pre_ping",[174,299,252],{"class":180},[174,301,302],{"class":230},"True\n",[174,304,306],{"class":176,"line":305},12,[174,307,308],{"class":184},")\n",[174,310,312],{"class":176,"line":311},13,[174,313,224],{"emptyLinePlaceholder":223},[174,315,317,320,322],{"class":176,"line":316},14,[174,318,319],{"class":184},"async_session_factory ",[174,321,252],{"class":180},[174,323,324],{"class":184}," sessionmaker(\n",[174,326,328,331,333],{"class":176,"line":327},15,[174,329,330],{"class":270}," bind",[174,332,252],{"class":180},[174,334,335],{"class":184},"engine, \n",[174,337,339,342,344],{"class":176,"line":338},16,[174,340,341],{"class":270}," class_",[174,343,252],{"class":180},[174,345,346],{"class":184},"AsyncSession, \n",[174,348,350,353,355],{"class":176,"line":349},17,[174,351,352],{"class":270}," expire_on_commit",[174,354,252],{"class":180},[174,356,357],{"class":230},"False\n",[174,359,361],{"class":176,"line":360},18,[174,362,308],{"class":184},[153,364,366],{"id":365},"_2-refactor-orm-queries","2. Refactor ORM Queries",[19,368,369,370,373,374,377],{},"Replace legacy ",[22,371,372],{},"session.query()"," with the 2.0 ",[22,375,376],{},"select()"," construct and ensure all I\u002FO operations are awaited.",[165,379,381],{"className":167,"code":380,"language":169,"meta":170,"style":170},"from sqlalchemy import select\nfrom myapp.models import User\n\nasync def fetch_active_users(session: AsyncSession) -> list[User]:\n stmt = select(User).where(User.is_active == True)\n result = await session.execute(stmt)\n return result.scalars().all()\n",[22,382,383,395,407,411,426,444,457],{"__ignoreMap":170},[174,384,385,387,390,392],{"class":176,"line":177},[174,386,181],{"class":180},[174,388,389],{"class":184}," sqlalchemy ",[174,391,188],{"class":180},[174,393,394],{"class":184}," select\n",[174,396,397,399,402,404],{"class":176,"line":194},[174,398,181],{"class":180},[174,400,401],{"class":184}," myapp.models ",[174,403,188],{"class":180},[174,405,406],{"class":184}," User\n",[174,408,409],{"class":176,"line":207},[174,410,224],{"emptyLinePlaceholder":223},[174,412,413,416,419,423],{"class":176,"line":220},[174,414,415],{"class":180},"async",[174,417,418],{"class":180}," def",[174,420,422],{"class":421},"sScJk"," fetch_active_users",[174,424,425],{"class":184},"(session: AsyncSession) -> list[User]:\n",[174,427,428,431,433,436,439,442],{"class":176,"line":227},[174,429,430],{"class":184}," stmt ",[174,432,252],{"class":180},[174,434,435],{"class":184}," select(User).where(User.is_active ",[174,437,438],{"class":180},"==",[174,440,441],{"class":230}," True",[174,443,308],{"class":184},[174,445,446,449,451,454],{"class":176,"line":241},[174,447,448],{"class":184}," result ",[174,450,252],{"class":180},[174,452,453],{"class":180}," await",[174,455,456],{"class":184}," session.execute(stmt)\n",[174,458,459,462],{"class":176,"line":246},[174,460,461],{"class":180}," return",[174,463,464],{"class":184}," result.scalars().all()\n",[153,466,468],{"id":467},"_3-safe-execution-of-legacy-sync-code","3. Safe Execution of Legacy Sync Code",[19,470,471,472,475],{},"When you must run raw SQL or legacy functions, use ",[22,473,474],{},"session.run_sync()"," to execute them in a controlled thread pool without triggering spawn errors.",[165,477,479],{"className":167,"code":478,"language":169,"meta":170,"style":170},"from sqlalchemy import text\nfrom sqlalchemy.ext.asyncio import AsyncSession\nfrom typing import Any\n\nasync def run_legacy_query(session: AsyncSession) -> Any:\n def sync_operation(conn: Any) -> Any:\n return conn.execute(text(\"SELECT 1\")).scalar()\n \n return await session.run_sync(sync_operation)\n",[22,480,481,492,503,514,518,530,540,553,558],{"__ignoreMap":170},[174,482,483,485,487,489],{"class":176,"line":177},[174,484,181],{"class":180},[174,486,389],{"class":184},[174,488,188],{"class":180},[174,490,491],{"class":184}," text\n",[174,493,494,496,498,500],{"class":176,"line":194},[174,495,181],{"class":180},[174,497,185],{"class":184},[174,499,188],{"class":180},[174,501,502],{"class":184}," AsyncSession\n",[174,504,505,507,509,511],{"class":176,"line":207},[174,506,181],{"class":180},[174,508,212],{"class":184},[174,510,188],{"class":180},[174,512,513],{"class":184}," Any\n",[174,515,516],{"class":176,"line":220},[174,517,224],{"emptyLinePlaceholder":223},[174,519,520,522,524,527],{"class":176,"line":227},[174,521,415],{"class":180},[174,523,418],{"class":180},[174,525,526],{"class":421}," run_legacy_query",[174,528,529],{"class":184},"(session: AsyncSession) -> Any:\n",[174,531,532,534,537],{"class":176,"line":241},[174,533,418],{"class":180},[174,535,536],{"class":421}," sync_operation",[174,538,539],{"class":184},"(conn: Any) -> Any:\n",[174,541,542,544,547,550],{"class":176,"line":246},[174,543,461],{"class":180},[174,545,546],{"class":184}," conn.execute(text(",[174,548,549],{"class":237},"\"SELECT 1\"",[174,551,552],{"class":184},")).scalar()\n",[174,554,555],{"class":176,"line":258},[174,556,557],{"class":184}," \n",[174,559,560,562,564],{"class":176,"line":267},[174,561,461],{"class":180},[174,563,453],{"class":180},[174,565,566],{"class":184}," session.run_sync(sync_operation)\n",[153,568,570],{"id":569},"_4-fastapi-dependency-injection","4. FastAPI Dependency Injection",[19,572,573,574,578],{},"Apply proper lifecycle management when ",[130,575,577],{"href":576},"\u002Fasync-engines-dialects-and-connection-pooling\u002Fintegrating-sqlalchemy-async-with-fastapi-and-starlette\u002F","Integrating SQLAlchemy Async with FastAPI and Starlette",". Use async context managers to guarantee connection release.",[165,580,582],{"className":167,"code":581,"language":169,"meta":170,"style":170},"from fastapi import Depends, FastAPI\nfrom sqlalchemy.ext.asyncio import AsyncSession\n\napp = FastAPI()\n\nasync def get_async_session() -> AsyncGenerator[AsyncSession, None]:\n async with async_session_factory() as session:\n yield session\n await session.close()\n\n@app.get(\"\u002Fitems\")\nasync def read_items(session: AsyncSession = Depends(get_async_session)):\n # Session is automatically scoped and closed after response\n return {\"status\": \"async session active\"}\n",[22,583,584,596,606,610,620,624,642,659,667,674,678,691,708,714],{"__ignoreMap":170},[174,585,586,588,591,593],{"class":176,"line":177},[174,587,181],{"class":180},[174,589,590],{"class":184}," fastapi ",[174,592,188],{"class":180},[174,594,595],{"class":184}," Depends, FastAPI\n",[174,597,598,600,602,604],{"class":176,"line":194},[174,599,181],{"class":180},[174,601,185],{"class":184},[174,603,188],{"class":180},[174,605,502],{"class":184},[174,607,608],{"class":176,"line":207},[174,609,224],{"emptyLinePlaceholder":223},[174,611,612,615,617],{"class":176,"line":220},[174,613,614],{"class":184},"app ",[174,616,252],{"class":180},[174,618,619],{"class":184}," FastAPI()\n",[174,621,622],{"class":176,"line":227},[174,623,224],{"emptyLinePlaceholder":223},[174,625,626,628,630,633,636,639],{"class":176,"line":241},[174,627,415],{"class":180},[174,629,418],{"class":180},[174,631,632],{"class":421}," get_async_session",[174,634,635],{"class":184},"() -> AsyncGenerator[AsyncSession, ",[174,637,638],{"class":230},"None",[174,640,641],{"class":184},"]:\n",[174,643,644,647,650,653,656],{"class":176,"line":246},[174,645,646],{"class":180}," async",[174,648,649],{"class":180}," with",[174,651,652],{"class":184}," async_session_factory() ",[174,654,655],{"class":180},"as",[174,657,658],{"class":184}," session:\n",[174,660,661,664],{"class":176,"line":258},[174,662,663],{"class":180}," yield",[174,665,666],{"class":184}," session\n",[174,668,669,671],{"class":176,"line":267},[174,670,453],{"class":180},[174,672,673],{"class":184}," session.close()\n",[174,675,676],{"class":176,"line":281},[174,677,224],{"emptyLinePlaceholder":223},[174,679,680,683,686,689],{"class":176,"line":294},[174,681,682],{"class":421},"@app.get",[174,684,685],{"class":184},"(",[174,687,688],{"class":237},"\"\u002Fitems\"",[174,690,308],{"class":184},[174,692,693,695,697,700,703,705],{"class":176,"line":305},[174,694,415],{"class":180},[174,696,418],{"class":180},[174,698,699],{"class":421}," read_items",[174,701,702],{"class":184},"(session: AsyncSession ",[174,704,252],{"class":180},[174,706,707],{"class":184}," Depends(get_async_session)):\n",[174,709,710],{"class":176,"line":311},[174,711,713],{"class":712},"sJ8bj"," # Session is automatically scoped and closed after response\n",[174,715,716,718,721,724,727,730],{"class":176,"line":316},[174,717,461],{"class":180},[174,719,720],{"class":184}," {",[174,722,723],{"class":237},"\"status\"",[174,725,726],{"class":184},": ",[174,728,729],{"class":237},"\"async session active\"",[174,731,732],{"class":184},"}\n",[14,734,736],{"id":735},"advanced-optimization-connection-pooling-and-concurrency-limits","Advanced Optimization: Connection Pooling and Concurrency Limits",[19,738,739],{},"Improper pool configuration under async load can cause connection starvation, indirectly triggering greenlet context-switching failures.",[741,742,743,765,775,791],"ul",{},[34,744,745,752,753,756,757,760,761,764],{},[37,746,747,748,751],{},"Tune ",[22,749,750],{},"AsyncEngine"," parameters:"," Set ",[22,754,755],{},"pool_size"," to match your expected concurrent requests. Use ",[22,758,759],{},"max_overflow"," for traffic spikes and ",[22,762,763],{},"pool_pre_ping=True"," to validate stale connections before execution.",[34,766,767,770,771,774],{},[37,768,769],{},"Serverless\u002FShort-Lived Functions:"," Use ",[22,772,773],{},"poolclass=NullPool"," to disable connection pooling entirely. This prevents idle connection leaks in AWS Lambda or Cloud Run environments.",[34,776,777,780,781,783,784,787,788,75],{},[37,778,779],{},"Monitor Event Loop Latency:"," High ",[22,782,112],{}," context-switching overhead correlates with event loop delays. Use ",[22,785,786],{},"asyncio.get_event_loop().time()"," or profiling tools to detect blocking calls that exceed ",[22,789,790],{},"10ms",[34,792,793,796,797,800,801,804],{},[37,794,795],{},"Connection Recycling:"," For long-running async workers, configure ",[22,798,799],{},"pool_recycle=3600"," (or your database's timeout) to prevent ",[22,802,803],{},"OperationalError"," from dropped TCP connections.",[14,806,808],{"id":807},"common-pitfalls","Common Pitfalls",[810,811,812,828],"table",{},[813,814,815],"thead",{},[816,817,818,822,825],"tr",{},[819,820,821],"th",{},"Pitfall",[819,823,824],{},"Impact",[819,826,827],{},"Resolution",[829,830,831,854,886,907],"tbody",{},[816,832,833,839,848],{},[834,835,836],"td",{},[37,837,838],{},"Mixing Sync and Async Engines",[834,840,841,842,65,844,847],{},"Using ",[22,843,47],{},[22,845,846],{},"+asyncpg"," forces synchronous fallback, triggering greenlet spawn attempts.",[834,849,850,851,853],{},"Always use ",[22,852,68],{}," for async dialects.",[816,855,856,861,877],{},[834,857,858],{},[37,859,860],{},"Calling ORM Methods Outside Async Contexts",[834,862,863,864,85,867,869,870,872,873,876],{},"Invoking ",[22,865,866],{},"session.commit()",[22,868,372],{}," directly in ",[22,871,55],{}," without ",[22,874,875],{},"await"," blocks the loop.",[834,878,879,880,69,883,885],{},"Use ",[22,881,882],{},"await session.commit()",[22,884,74],{}," exclusively.",[816,887,888,893,896],{},[834,889,890],{},[37,891,892],{},"Incorrect Pool Configuration",[834,894,895],{},"Default pool sizes cause connection starvation under load, leading to blocked threads and spawn failures.",[834,897,898,899,44,901,903,904,75],{},"Explicitly set ",[22,900,755],{},[22,902,759],{},", and monitor ",[22,905,906],{},"pool_recycle",[816,908,909,914,921],{},[834,910,911],{},[37,912,913],{},"Missing or Outdated Greenlet Dependency",[834,915,916,917,920],{},"SQLAlchemy 2.0 with ",[22,918,919],{},"greenlet\u003C1.1.0"," breaks the async compatibility layer.",[834,922,923,924,927,928,75],{},"Run ",[22,925,926],{},"pip install \"greenlet>=1.1.0\""," and verify Python ",[22,929,101],{},[14,931,933],{"id":932},"frequently-asked-questions","Frequently Asked Questions",[19,935,936,939,940,942,943,945,946,948],{},[37,937,938],{},"Why does GreenletSpawnError only occur in async contexts?","\nSQLAlchemy's async layer uses ",[22,941,112],{}," to transparently run synchronous DBAPI code inside an ",[22,944,28],{}," event loop. When the loop is already running, ",[22,947,112],{}," cannot safely spawn a new micro-thread for blocking I\u002FO, raising the error to prevent event loop corruption.",[19,950,951,954,955,957,958,69,960,962,963,75],{},[37,952,953],{},"Can I disable greenlet entirely in SQLAlchemy 2.0?","\nNo, ",[22,956,112],{}," is a core dependency for async SQLAlchemy. Instead, ensure all database interactions use ",[22,959,74],{},[22,961,875],{},"-compatible methods, or explicitly wrap sync calls with ",[22,964,474],{},[19,966,967,970,971,69,973,975],{},[37,968,969],{},"Does switching to asyncpg or aiosqlite fix the error automatically?","\nOnly if you also migrate to ",[22,972,68],{},[22,974,74],{},". The dialect alone doesn't bypass the async\u002Fsync boundary; the ORM session layer must be explicitly configured for async execution.",[19,977,978,981,982,85,984,986,987,989],{},[37,979,980],{},"How do I handle third-party sync libraries that require database connections?","\nUse ",[22,983,88],{},[22,985,474],{}," to execute the third-party code in a thread pool, ensuring the main event loop remains unblocked and ",[22,988,112],{}," spawn limits are respected.",[991,992,993],"style",{},"html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}",{"title":170,"searchDepth":194,"depth":194,"links":995},[996,997,998,1004,1005,1006],{"id":16,"depth":194,"text":17},{"id":105,"depth":194,"text":106},{"id":137,"depth":194,"text":138,"children":999},[1000,1001,1002,1003],{"id":155,"depth":207,"text":156},{"id":365,"depth":207,"text":366},{"id":467,"depth":207,"text":468},{"id":569,"depth":207,"text":570},{"id":735,"depth":194,"text":736},{"id":807,"depth":194,"text":808},{"id":932,"depth":194,"text":933},"md",{},"\u002Fasync-engines-dialects-and-connection-pooling\u002Fintegrating-sqlalchemy-async-with-fastapi-and-starlette\u002Ffixing-greenletspawnerror-in-async-sqlalchemy-workflows",{"title":5,"description":170},"async-engines-dialects-and-connection-pooling\u002Fintegrating-sqlalchemy-async-with-fastapi-and-starlette\u002Ffixing-greenletspawnerror-in-async-sqlalchemy-workflows\u002Findex","HOnSsP5K-VBFy4mGJDnpRjCDkuBhi3_xE9wHzOYPhXo",1778149144400]