Skip to content

Commit 6ecf894

Browse files
docs: use lambda over getconn func (#1251)
Update README and integration tests to be more pythonic by using lambda over intermediate getconn function.
1 parent 3e45958 commit 6ecf894

8 files changed

+96
-195
lines changed

README.md

+61-126
Original file line numberDiff line numberDiff line change
@@ -126,21 +126,16 @@ import sqlalchemy
126126
# initialize Connector object
127127
connector = Connector()
128128

129-
# function to return the database connection
130-
def getconn() -> pymysql.connections.Connection:
131-
conn: pymysql.connections.Connection = connector.connect(
129+
# initialize SQLAlchemy connection pool with Connector
130+
pool = sqlalchemy.create_engine(
131+
"mysql+pymysql://",
132+
creator=lambda: connector.connect(
132133
"project:region:instance",
133134
"pymysql",
134135
user="my-user",
135136
password="my-password",
136137
db="my-db-name"
137-
)
138-
return conn
139-
140-
# create connection pool
141-
pool = sqlalchemy.create_engine(
142-
"mysql+pymysql://",
143-
creator=getconn,
138+
),
144139
)
145140
```
146141

@@ -207,33 +202,21 @@ Connector as a context manager:
207202

208203
```python
209204
from google.cloud.sql.connector import Connector
210-
import pymysql
211205
import sqlalchemy
212206

213-
# helper function to return SQLAlchemy connection pool
214-
def init_connection_pool(connector: Connector) -> sqlalchemy.engine.Engine:
215-
# function used to generate database connection
216-
def getconn() -> pymysql.connections.Connection:
217-
conn = connector.connect(
207+
# initialize Cloud SQL Python Connector as context manager
208+
with Connector() as connector:
209+
# initialize SQLAlchemy connection pool with Connector
210+
pool = sqlalchemy.create_engine(
211+
"mysql+pymysql://",
212+
creator=lambda: connector.connect(
218213
"project:region:instance",
219214
"pymysql",
220215
user="my-user",
221216
password="my-password",
222217
db="my-db-name"
223-
)
224-
return conn
225-
226-
# create connection pool
227-
pool = sqlalchemy.create_engine(
228-
"mysql+pymysql://",
229-
creator=getconn,
218+
),
230219
)
231-
return pool
232-
233-
# initialize Cloud SQL Python Connector as context manager
234-
with Connector() as connector:
235-
# initialize connection pool
236-
pool = init_connection_pool(connector)
237220
# insert statement
238221
insert_stmt = sqlalchemy.text(
239222
"INSERT INTO my_table (id, title) VALUES (:id, :title)",
@@ -401,30 +384,19 @@ from google.cloud.sql.connector import Connector, DnsResolver
401384
import pymysql
402385
import sqlalchemy
403386

404-
# helper function to return SQLAlchemy connection pool
405-
def init_connection_pool(connector: Connector) -> sqlalchemy.engine.Engine:
406-
# function used to generate database connection
407-
def getconn() -> pymysql.connections.Connection:
408-
conn = connector.connect(
387+
# initialize Cloud SQL Python Connector with `resolver=DnsResolver`
388+
with Connector(resolver=DnsResolver) as connector:
389+
# initialize SQLAlchemy connection pool with Connector
390+
pool = sqlalchemy.create_engine(
391+
"mysql+pymysql://",
392+
creator=lambda: connector.connect(
409393
"prod-db.mycompany.example.com", # using DNS name
410394
"pymysql",
411395
user="my-user",
412396
password="my-password",
413397
db="my-db-name"
414-
)
415-
return conn
416-
417-
# create connection pool
418-
pool = sqlalchemy.create_engine(
419-
"mysql+pymysql://",
420-
creator=getconn,
398+
),
421399
)
422-
return pool
423-
424-
# initialize Cloud SQL Python Connector with `resolver=DnsResolver`
425-
with Connector(resolver=DnsResolver) as connector:
426-
# initialize connection pool
427-
pool = init_connection_pool(connector)
428400
# ... use SQLAlchemy engine normally
429401
```
430402

@@ -501,25 +473,19 @@ from google.cloud.sql.connector import Connector
501473
# initialize Python Connector object
502474
connector = Connector()
503475

504-
# Python Connector database connection function
505-
def getconn():
506-
conn = connector.connect(
476+
app = Flask(__name__)
477+
478+
# configure Flask-SQLAlchemy to use Python Connector
479+
app.config['SQLALCHEMY_DATABASE_URI'] = "postgresql+pg8000://"
480+
app.config['SQLALCHEMY_ENGINE_OPTIONS'] = {
481+
"creator": lambda: conn = connector.connect(
507482
"project:region:instance-name", # Cloud SQL Instance Connection Name
508483
"pg8000",
509484
user="my-user",
510485
password="my-password",
511486
db="my-database",
512487
ip_type="public" # "private" for private IP
513488
)
514-
return conn
515-
516-
517-
app = Flask(__name__)
518-
519-
# configure Flask-SQLAlchemy to use Python Connector
520-
app.config['SQLALCHEMY_DATABASE_URI'] = "postgresql+pg8000://"
521-
app.config['SQLALCHEMY_ENGINE_OPTIONS'] = {
522-
"creator": getconn
523489
}
524490

525491
# initialize the app with the extension
@@ -540,38 +506,27 @@ your web application using [SQLAlchemy ORM](https://docs.sqlalchemy.org/en/14/or
540506
through the following:
541507

542508
```python
543-
from sqlalchemy import create_engine
544-
from sqlalchemy.engine import Engine
509+
import sqlalchemy
545510
from sqlalchemy.ext.declarative import declarative_base
546511
from sqlalchemy.orm import sessionmaker
547512
from google.cloud.sql.connector import Connector
548513

549-
# helper function to return SQLAlchemy connection pool
550-
def init_connection_pool(connector: Connector) -> Engine:
551-
# Python Connector database connection function
552-
def getconn():
553-
conn = connector.connect(
554-
"project:region:instance-name", # Cloud SQL Instance Connection Name
555-
"pg8000",
556-
user="my-user",
557-
password="my-password",
558-
db="my-database",
559-
ip_type="public" # "private" for private IP
560-
)
561-
return conn
562-
563-
SQLALCHEMY_DATABASE_URL = "postgresql+pg8000://"
564-
565-
engine = create_engine(
566-
SQLALCHEMY_DATABASE_URL , creator=getconn
567-
)
568-
return engine
569514

570515
# initialize Cloud SQL Python Connector
571516
connector = Connector()
572517

573518
# create connection pool engine
574-
engine = init_connection_pool(connector)
519+
engine = sqlalchemy.create_engine(
520+
"postgresql+pg8000://",
521+
creator=lambda: connector.connect(
522+
"project:region:instance-name", # Cloud SQL Instance Connection Name
523+
"pg8000",
524+
user="my-user",
525+
password="my-password",
526+
db="my-database",
527+
ip_type="public" # "private" for private IP
528+
),
529+
)
575530

576531
# create SQLAlchemy ORM session
577532
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
@@ -640,40 +595,29 @@ async def main():
640595
#### SQLAlchemy Async Engine
641596

642597
```python
643-
import asyncpg
644-
645598
import sqlalchemy
646599
from sqlalchemy.ext.asyncio import AsyncEngine, create_async_engine
647600

648601
from google.cloud.sql.connector import Connector, create_async_connector
649602

650-
async def init_connection_pool(connector: Connector) -> AsyncEngine:
651-
# creation function to generate asyncpg connections as 'async_creator' arg
652-
async def getconn() -> asyncpg.Connection:
653-
conn: asyncpg.Connection = await connector.connect_async(
603+
604+
async def main():
605+
# initialize Connector object for connections to Cloud SQL
606+
connector = await create_async_connector()
607+
608+
# The Cloud SQL Python Connector can be used along with SQLAlchemy using the
609+
# 'async_creator' argument to 'create_async_engine'
610+
pool = create_async_engine(
611+
"postgresql+asyncpg://",
612+
async_creator=lambda: connector.connect_async(
654613
"project:region:instance", # Cloud SQL instance connection name
655614
"asyncpg",
656615
user="my-user",
657616
password="my-password",
658617
db="my-db-name"
659618
# ... additional database driver args
660-
)
661-
return conn
662-
663-
# The Cloud SQL Python Connector can be used along with SQLAlchemy using the
664-
# 'async_creator' argument to 'create_async_engine'
665-
pool = create_async_engine(
666-
"postgresql+asyncpg://",
667-
async_creator=getconn,
619+
),
668620
)
669-
return pool
670-
671-
async def main():
672-
# initialize Connector object for connections to Cloud SQL
673-
connector = await create_async_connector()
674-
675-
# initialize connection pool
676-
pool = await init_connection_pool(connector)
677621

678622
# example query
679623
async with pool.connect() as conn:
@@ -744,33 +688,24 @@ from sqlalchemy.ext.asyncio import AsyncEngine, create_async_engine
744688

745689
from google.cloud.sql.connector import Connector
746690

747-
async def init_connection_pool(connector: Connector) -> AsyncEngine:
748-
# creation function to generate asyncpg connections as 'async_creator' arg
749-
async def getconn() -> asyncpg.Connection:
750-
conn: asyncpg.Connection = await connector.connect_async(
751-
"project:region:instance", # Cloud SQL instance connection name
752-
"asyncpg",
753-
user="my-user",
754-
password="my-password",
755-
db="my-db-name"
756-
# ... additional database driver args
757-
)
758-
return conn
759-
760-
# The Cloud SQL Python Connector can be used along with SQLAlchemy using the
761-
# 'async_creator' argument to 'create_async_engine'
762-
pool = create_async_engine(
763-
"postgresql+asyncpg://",
764-
async_creator=getconn,
765-
)
766-
return pool
767691

768692
async def main():
769693
# initialize Connector object for connections to Cloud SQL
770694
loop = asyncio.get_running_loop()
771695
async with Connector(loop=loop) as connector:
772-
# initialize connection pool
773-
pool = await init_connection_pool(connector)
696+
# The Cloud SQL Python Connector can be used along with SQLAlchemy using the
697+
# 'async_creator' argument to 'create_async_engine'
698+
pool = create_async_engine(
699+
"postgresql+asyncpg://",
700+
async_creator=lambda: connector.connect_async(
701+
"project:region:instance", # Cloud SQL instance connection name
702+
"asyncpg",
703+
user="my-user",
704+
password="my-password",
705+
db="my-db-name"
706+
# ... additional database driver args
707+
),
708+
)
774709

775710
# example query
776711
async with pool.connect() as conn:

tests/system/test_asyncpg_connection.py

+5-9
Original file line numberDiff line numberDiff line change
@@ -78,21 +78,17 @@ async def create_sqlalchemy_engine(
7878
loop=loop, refresh_strategy=refresh_strategy, resolver=resolver
7979
)
8080

81-
async def getconn() -> asyncpg.Connection:
82-
conn: asyncpg.Connection = await connector.connect_async(
81+
# create SQLAlchemy connection pool
82+
engine = sqlalchemy.ext.asyncio.create_async_engine(
83+
"postgresql+asyncpg://",
84+
async_creator=lambda: connector.connect_async(
8385
instance_connection_name,
8486
"asyncpg",
8587
user=user,
8688
password=password,
8789
db=db,
8890
ip_type="public", # can also be "private" or "psc"
89-
)
90-
return conn
91-
92-
# create SQLAlchemy connection pool
93-
engine = sqlalchemy.ext.asyncio.create_async_engine(
94-
"postgresql+asyncpg://",
95-
async_creator=getconn,
91+
),
9692
execution_options={"isolation_level": "AUTOCOMMIT"},
9793
)
9894
return engine, connector

tests/system/test_asyncpg_iam_auth.py

+5-10
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
import asyncio
1818
import os
1919

20-
import asyncpg
2120
import sqlalchemy
2221
import sqlalchemy.ext.asyncio
2322

@@ -64,21 +63,17 @@ async def create_sqlalchemy_engine(
6463
loop = asyncio.get_running_loop()
6564
connector = Connector(loop=loop, refresh_strategy=refresh_strategy)
6665

67-
async def getconn() -> asyncpg.Connection:
68-
conn: asyncpg.Connection = await connector.connect_async(
66+
# create SQLAlchemy connection pool
67+
engine = sqlalchemy.ext.asyncio.create_async_engine(
68+
"postgresql+asyncpg://",
69+
async_creator=lambda: connector.connect_async(
6970
instance_connection_name,
7071
"asyncpg",
7172
user=user,
7273
db=db,
7374
ip_type="public", # can also be "private" or "psc"
7475
enable_iam_auth=True,
75-
)
76-
return conn
77-
78-
# create SQLAlchemy connection pool
79-
engine = sqlalchemy.ext.asyncio.create_async_engine(
80-
"postgresql+asyncpg://",
81-
async_creator=getconn,
76+
),
8277
execution_options={"isolation_level": "AUTOCOMMIT"},
8378
)
8479
return engine, connector

tests/system/test_pg8000_connection.py

+5-10
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@
2020
# [START cloud_sql_connector_postgres_pg8000]
2121
from typing import Union
2222

23-
import pg8000
2423
import sqlalchemy
2524

2625
from google.cloud.sql.connector import Connector
@@ -77,21 +76,17 @@ def create_sqlalchemy_engine(
7776
"""
7877
connector = Connector(refresh_strategy=refresh_strategy, resolver=resolver)
7978

80-
def getconn() -> pg8000.dbapi.Connection:
81-
conn: pg8000.dbapi.Connection = connector.connect(
79+
# create SQLAlchemy connection pool
80+
engine = sqlalchemy.create_engine(
81+
"postgresql+pg8000://",
82+
creator=lambda: connector.connect(
8283
instance_connection_name,
8384
"pg8000",
8485
user=user,
8586
password=password,
8687
db=db,
8788
ip_type="public", # can also be "private" or "psc"
88-
)
89-
return conn
90-
91-
# create SQLAlchemy connection pool
92-
engine = sqlalchemy.create_engine(
93-
"postgresql+pg8000://",
94-
creator=getconn,
89+
),
9590
)
9691
return engine, connector
9792

0 commit comments

Comments
 (0)