【问题标题】:Connect Django to Google Cloud SQL将 Django 连接到 Google Cloud SQL
【发布时间】:2013-10-05 20:40:45
【问题描述】:

我正在尝试将 Django 连接到 Google 云 SQL,在 windows 下使用 python 2.7 和 django 1.5。我浏览了此页面上的说明:https://developers.google.com/appengine/docs/python/cloud-sql/django

我的 settings.py 文件具有以下形式的基本数据库设置:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'INSTANCE': 'my_project:instance1',
        'NAME': 'my_database',
    }
}

当然有一个适当的 SQL 实例和一个通过 google apis 控制台的 SQL 提示创建的数据库

当我第一次尝试运行 manage.py syncdb 以获取 OAuth2 令牌时,我得到了这个:

OperationalError: (2003, "Can't connect to MySQL server on 'localhost' (10061)")

在你问之前,我确实确保 django 和 google 包都在我的 PYTHONPATH 以及“C:\Program Files (x86)\Google\google_appengine\lib\django-1.5”中

非常欢迎任何帮助!

【问题讨论】:

    标签: django python-2.7 google-app-engine oauth-2.0 google-cloud-sql


    【解决方案1】:

    在 Django 中连接到 Google Cloud SQL 的示例:

    AppEngine Standard, Python 2.7:

    try:
        import MySQLdb  # noqa: F401
    except ImportError:
        import pymysql
        pymysql.install_as_MySQLdb()
    
    if os.getenv('SERVER_SOFTWARE', '').startswith('Google App Engine'):
        # Running on production App Engine, so connect to Google Cloud SQL using
        # the unix socket at /cloudsql/<your-cloudsql-connection string>
        DATABASES = {
            'default': {
                'ENGINE': 'django.db.backends.mysql',
                'HOST': '/cloudsql/<your-cloudsql-connection-string>',
                'NAME': '<your-database-name>',
                'USER': '<your-database-user>',
                'PASSWORD': '<your-database-password>',
            }
        }
    else:
        # Running locally so connect to either a local MySQL instance or connect to
        # Cloud SQL via the proxy. To start the proxy via command line:
        #
        #     $ cloud_sql_proxy -instances=[INSTANCE_CONNECTION_NAME]=tcp:3306
        #
        # See https://cloud.google.com/sql/docs/mysql-connect-proxy
        DATABASES = {
            'default': {
                'ENGINE': 'django.db.backends.mysql',
                'HOST': '127.0.0.1', # DB's IP address
                'PORT': '3306',
                'NAME': '<your-database-name>',
                'USER': '<your-database-user>',
                'PASSWORD': '<your-database-password>',
            }
        }
    

    来源:GCP Python Django Samples AppEngine Standard Python 2.7


    AppEngine Standard, Python 3.7:

    # Install PyMySQL as mysqlclient/MySQLdb to use Django's mysqlclient adapter
    # See https://docs.djangoproject.com/en/2.1/ref/databases/#mysql-db-api-drivers
    # for more information
    import pymysql  # noqa: 402
    pymysql.install_as_MySQLdb()
    
    if os.getenv('GAE_APPLICATION', None):
        # Running on production App Engine, so connect to Google Cloud SQL using
        # the unix socket at /cloudsql/<your-cloudsql-connection string>
        DATABASES = {
            'default': {
                'ENGINE': 'django.db.backends.mysql',
                'HOST': '/cloudsql/[YOUR-CONNECTION-NAME]',
                'USER': '[YOUR-USERNAME]',
                'PASSWORD': '[YOUR-PASSWORD]',
                'NAME': '[YOUR-DATABASE]',
            }
        }
    else:
        # Running locally so connect to either a local MySQL instance or connect to
        # Cloud SQL via the proxy. To start the proxy via command line:
        #
        #     $ cloud_sql_proxy -instances=[INSTANCE_CONNECTION_NAME]=tcp:3306
        #
        # See https://cloud.google.com/sql/docs/mysql-connect-proxy
        DATABASES = {
            'default': {
                'ENGINE': 'django.db.backends.mysql',
                'HOST': '127.0.0.1', # DB's IP address
                'PORT': '3306',
                'NAME': '[YOUR-DATABASE]',
                'USER': '[YOUR-USERNAME]',
                'PASSWORD': '[YOUR-PASSWORD]',
            }
        }
    

    来源GCP Python Django Samples AppEngine Standard Python 3.7


    AppEngine Flexible:

    DATABASES = {
        'default': {
            # If you are using Cloud SQL for MySQL rather than PostgreSQL, set
            # 'ENGINE': 'django.db.backends.mysql' instead of the following.
            'ENGINE': 'django.db.backends.postgresql',
            'NAME': 'polls',
            'USER': '<your-database-user>',
            'PASSWORD': '<your-database-password>',
            # For MySQL, set 'PORT': '3306' instead of the following. Any Cloud
            # SQL Proxy instances running locally must also be set to tcp:3306.
            'PORT': '5432',
        }
    }
    # In the flexible environment, you connect to CloudSQL using a unix socket.
    # Locally, you can use the CloudSQL proxy to proxy a localhost connection
    # to the instance
    DATABASES['default']['HOST'] = '/cloudsql/<your-cloudsql-connection-string>'
    if os.getenv('GAE_INSTANCE'):
        pass
    else:
        DATABASES['default']['HOST'] = '127.0.0.1' # DB's IP address
    

    来源GCP Python Django Samples AppEngine Flexible

    【讨论】:

    • 在 GAE 标准上部署时是否需要硬编码密码?
    • @Aseem 在生产环境中,您可以在app.yaml 文件中定义环境变量,以使它们可用于您的应用程序并从os.environ 导入它们。 Source here
    • 我已经使用了上面的代码,它在我的本地主机上运行良好,但在生产环境中却不行。我在任何地方都找不到更好的建议。请帮忙。 @玛塔
    • 嗨@DineshRoy 好久没发帖了,很抱歉,我还没看到。您是否部署了正确的app.yaml 文件?
    【解决方案2】:

    该数据库配置仅在从 AppEngine 连接时才有意义。如果您想使用 django 从本地计算机访问 CloudSQL 数据库,则应使用 google.appengine.ext.django.backends.rdbms 引擎。

    您可以在此处查看不同的配置选项: https://developers.google.com/appengine/docs/python/cloud-sql/django#development-settings

    编辑google.appengine.ext.django.backends.rdbms 引擎已被弃用。如果您想从本地计算机连接到 Google Cloud SQL,您应该使用 IP 连接。您可以使用 Cloud SQL 实例 IP(IPv4 或 IPv6)并使用标准 django.db.backends.mysql 引擎进行连接。

    【讨论】:

    • Google Cloud SQL 第二代的设置怎么样?我无法将其发送至work
    • 我更新了回复。您应该使用 IP 连接从 Google 外部进行连接。