Cloud SQL Python 连接器可以与 SQLAlchemy 一起使用吗?

问题描述 投票:0回答:2

所以我一直在尝试使用 Flask、sqlalchemy 和 Cloud SQL 部署 App Engine Standard 应用程序。当我发现在 App Engine 实例上部署时,使用herehere中描述的技术进行连接根本不起作用时,我相信我已经完成了所有编码并准备好部署。因此,在询问了一些事情之后,我相信我已经能够使用新发布的Cloud SQL Python Connector在我的应用程序和Cloud SQL服务器中的SQL实例之间建立连接,但我不知道如何进一步使用SQLAlchemy 库的连接。

例如,请参阅我的(相关)代码:

config.py

"""Flask configuration."""
from os import environ, path
from dotenv import load_dotenv
from google.cloud.sql.connector import connector

basedir = path.abspath(path.dirname(__file__))
load_dotenv(path.join(basedir, '.env'))

DB_USERNAME = environ.get('DB_USERNAME')
DB_PASSWORD = environ.get('DB_PASSWORD')
DB_ADDRESS = environ.get('DB_ADDRESS')
DB_PORT = environ.get('DB_PORT')
DB_NAME = environ.get('DB_NAME')
DB_CONNECTION_STRING = environ.get('DB_CONNECTION_STRING')
        
class Config:
    """Base config."""
    SECRET_KEY = environ.get('SECRET_KEY')
    STATIC_FOLDER = 'static'
    TEMPLATES_FOLDER = 'templates'
    SQLALCHEMY_TRACK_MODIFICATIONS = True
    connector.connect(
        DB_CONNECTION_STRING, 
        "pymysql",
        user=DB_USERNAME,
        password=DB_PASSWORD,
        db=DB_NAME
    )   

main.py

from flask import Flask, render_template, request, redirect, url_for, flash
from flask_sqlalchemy import SQLAlchemy
import random
import string
import datetime
import json
import re
from config import MAPBOX_TOKEN

#Create App
def create_app():
    app = Flask(__name__)
    app.config.from_object('config.DevConfig')
    return app

app = create_app()
db = SQLAlchemy(app)

# User ORM for SQLAlchemy
class Users(db.Model):
    id = db.Column(db.Integer, primary_key = True, nullable = False)
    ptoken = db.Column(db.String(255), nullable = False, unique = True)
    geodict = db.Column(db.Text, nullable = False)

虽然 Google 的

connector.connect
可以正常工作,但运行上面的代码时我会收到以下警告:

..\env\lib\site-packages\flask_sqlalchemy\__init__.py:851: UserWarning: Neither SQLALCHEMY_DATABASE_URI nor SQLALCHEMY_BINDS is set. Defaulting SQLALCHEMY_DATABASE_URI to "sqlite:///:memory:".

为了解决这个问题,我尝试了一些愚蠢的事情,例如:

class Config:
    """Base config."""
    SECRET_KEY = environ.get('SECRET_KEY')
    STATIC_FOLDER = 'static'
    TEMPLATES_FOLDER = 'templates'
    SQLALCHEMY_TRACK_MODIFICATIONS = True
    SQLALCHEMY_DATABASE_URI = connector.connect(
        DB_CONNECTION_STRING, 
        "pymysql",
        user=DB_USERNAME,
        password=DB_PASSWORD,
        db=DB_NAME
    )

但这显然行不通,我在网上找不到任何有用的信息。

所以我的问题是:Cloud SQL Python Connector 可以与 SQLAlchemy 一起使用吗?我怎样才能实现我想要做的事情?

python google-app-engine sqlalchemy google-cloud-sql
2个回答
2
投票

首先,从 App Engine 连接到 Cloud SQL 效果很好。 文档中有一整页关于如何执行此操作

其次,连接器可以用作该方法的替代方法。 这是与 SQL Alchemy 一起使用的示例。


0
投票

您要查找的内容记录在此处:https://github.com/GoogleCloudPlatform/cloud-sql-python-connector/blob/main/README.md#flask-sqlalchemy

关键信息是,您可以使用

SQLALCHEMY_ENGINE_OPTIONS
为Flask-SqlAlchemy管理的SqlAlchemy实例提供连接器工厂功能。

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from google.cloud.sql.connector import Connector, IPTypes


# initialize Python Connector object
connector = Connector()

# Python Connector database connection function
def getconn():
    conn = connector.connect(
        "project:region:instance-name", # Cloud SQL Instance Connection Name
        "pg8000",
        user="my-user",
        password="my-password",
        db="my-database",
        ip_type= IPTypes.PUBLIC  # IPTypes.PRIVATE for private IP
    )
    return conn


app = Flask(__name__)

# configure Flask-SQLAlchemy to use Python Connector
app.config['SQLALCHEMY_DATABASE_URI'] = "postgresql+pg8000://"
app.config['SQLALCHEMY_ENGINE_OPTIONS'] = {
    "creator": getconn
}

# initialize the app with the extension
db = SQLAlchemy()
db.init_app(app)
© www.soinside.com 2019 - 2024. All rights reserved.