|
20 | 20 | import sqlalchemy |
21 | 21 |
|
22 | 22 |
|
23 | | -# Remember - storing secrets in plaintext is potentially unsafe. Consider using |
24 | | -# something like https://cloud.google.com/kms/ to help keep secrets secret. |
25 | | -db_user = os.environ.get("DB_USER") |
26 | | -db_pass = os.environ.get("DB_PASS") |
27 | | -db_name = os.environ.get("DB_NAME") |
28 | | -cloud_sql_connection_name = os.environ.get("CLOUD_SQL_CONNECTION_NAME") |
29 | | - |
30 | 23 | app = Flask(__name__) |
31 | 24 |
|
32 | 25 | logger = logging.getLogger() |
@@ -71,60 +64,74 @@ def init_connection_engine(): |
71 | 64 |
|
72 | 65 | def init_tcp_connection_engine(db_config): |
73 | 66 | # [START cloud_sql_postgres_sqlalchemy_create_tcp] |
74 | | - db_socket_addr = os.environ.get("DB_HOST").split(":") |
75 | | - |
76 | | - # Extract host and port from socket address |
77 | | - db_host = db_socket_addr[0] |
78 | | - db_port = int(db_socket_addr[1]) |
79 | | - |
80 | | - return sqlalchemy.create_engine( |
| 67 | + # Remember - storing secrets in plaintext is potentially unsafe. Consider using |
| 68 | + # something like https://cloud.google.com/secret-manager/docs/overview to help keep |
| 69 | + # secrets secret. |
| 70 | + db_user = os.environ["DB_USER"] |
| 71 | + db_pass = os.environ["DB_PASS"] |
| 72 | + db_name = os.environ["DB_NAME"] |
| 73 | + db_host = os.environ["DB_HOST"] |
| 74 | + |
| 75 | + # Extract host and port from db_host |
| 76 | + host_args = db_host.split(":") |
| 77 | + db_hostname, db_port = host_args[0], int(host_args[1]) |
| 78 | + |
| 79 | + pool = sqlalchemy.create_engine( |
81 | 80 | # Equivalent URL: |
82 | 81 | # postgres+pg8000://<db_user>:<db_pass>@<db_host>:<db_port>/<db_name> |
83 | 82 | sqlalchemy.engine.url.URL( |
84 | 83 | drivername="postgres+pg8000", |
85 | | - username=db_user, |
86 | | - password=db_pass, |
87 | | - host=db_host, |
88 | | - port=db_port, |
89 | | - database=db_name |
| 84 | + username=db_user, # e.g. "my-database-user" |
| 85 | + password=db_pass, # e.g. "my-database-password" |
| 86 | + host=db_hostname, # e.g. "127.0.0.1" |
| 87 | + port=db_port, # e.g. 5432 |
| 88 | + database=db_name # e.g. "my-database-name" |
90 | 89 | ), |
91 | 90 | # ... Specify additional properties here. |
92 | | - # [START_EXCLUDE] |
| 91 | + # [END cloud_sql_postgres_sqlalchemy_create_tcp] |
93 | 92 | **db_config |
94 | | - # [END_EXCLUDE] |
| 93 | + # [START cloud_sql_postgres_sqlalchemy_create_tcp] |
95 | 94 | ) |
96 | 95 | # [END cloud_sql_postgres_sqlalchemy_create_tcp] |
97 | 96 |
|
| 97 | + return pool |
| 98 | + |
98 | 99 |
|
99 | 100 | def init_unix_connection_engine(db_config): |
100 | 101 | # [START cloud_sql_postgres_sqlalchemy_create_socket] |
101 | | - if os.environ.get("DB_SOCKET_PATH"): |
102 | | - socket_path = os.environ.get("DB_SOCKET_PATH") |
103 | | - else: |
104 | | - socket_path = "/cloudsql" |
105 | | - |
106 | | - return sqlalchemy.create_engine( |
| 102 | + # Remember - storing secrets in plaintext is potentially unsafe. Consider using |
| 103 | + # something like https://cloud.google.com/secret-manager/docs/overview to help keep |
| 104 | + # secrets secret. |
| 105 | + db_user = os.environ["DB_USER"] |
| 106 | + db_pass = os.environ["DB_PASS"] |
| 107 | + db_name = os.environ["DB_NAME"] |
| 108 | + db_socket_dir = os.environ.get("DB_SOCKET_DIR", "/cloudsql") |
| 109 | + cloud_sql_connection_name = os.environ["CLOUD_SQL_CONNECTION_NAME"] |
| 110 | + |
| 111 | + pool = sqlalchemy.create_engine( |
107 | 112 | # Equivalent URL: |
108 | 113 | # postgres+pg8000://<db_user>:<db_pass>@/<db_name> |
109 | 114 | # ?unix_sock=<socket_path>/<cloud_sql_instance_name>/.s.PGSQL.5432 |
110 | 115 | sqlalchemy.engine.url.URL( |
111 | 116 | drivername="postgres+pg8000", |
112 | | - username=db_user, |
113 | | - password=db_pass, |
114 | | - database=db_name, |
| 117 | + username=db_user, # e.g. "my-database-user" |
| 118 | + password=db_pass, # e.g. "my-database-password" |
| 119 | + database=db_name, # e.g. "my-database-name" |
115 | 120 | query={ |
116 | 121 | "unix_sock": "{}/{}/.s.PGSQL.5432".format( |
117 | | - socket_path, |
118 | | - cloud_sql_connection_name) |
| 122 | + db_socket_dir, # e.g. "/cloudsql" |
| 123 | + cloud_sql_connection_name) # i.e "<PROJECT-NAME>:<INSTANCE-REGION>:<INSTANCE-NAME>" |
119 | 124 | } |
120 | 125 | ), |
121 | 126 | # ... Specify additional properties here. |
122 | | - # [START_EXCLUDE] |
| 127 | + # [END cloud_sql_postgres_sqlalchemy_create_socket] |
123 | 128 | **db_config |
124 | | - # [END_EXCLUDE] |
| 129 | + # [START cloud_sql_postgres_sqlalchemy_create_socket] |
125 | 130 | ) |
126 | 131 | # [END cloud_sql_postgres_sqlalchemy_create_socket] |
127 | 132 |
|
| 133 | + return pool |
| 134 | + |
128 | 135 |
|
129 | 136 | # The SQLAlchemy engine will help manage interactions, including automatically |
130 | 137 | # managing a pool of connections to your database |
|
0 commit comments