无法使用SQLAlchemy的开发服务器连接到谷歌云SQL(Unable to connect to

2019-07-18 00:21发布

我一直不成功,在连接到谷歌云SQL使用的SQLAlchemy 0.7.9从我的开发工作站(在希望生成使用模式create_all())。 我不能获得通过以下错误:

sqlalchemy.exc.DBAPIError: (AssertionError) No api proxy found for service "rdbms" None None

我能够成功连接到使用数据库实例google_sql.py instancename ,最初开辟了浏览器对连接进行授权(现在似乎已缓存的授权,虽然我没有在~/Library/Preferences/com.google.cloud.plist文件https://developers.google.com/cloud-sql/docs/commandline指示我应该)

下面是我使用的测试连接的简单应用:

from sqlalchemy import create_engine

engine = create_engine('mysql+gaerdbms:///myapp', connect_args={"instance":"test"})
connection = engine.connect()

完整的堆栈跟踪可以在这里找到- https://gist.github.com/4486641

Answer 1:

原来, mysql+gaerdbms:///驱动程序SQLAlchemy的只是使用安装rdbms_apiproxy DBAPI,从谷歌应用程序引擎实例访问谷歌云SQL时才能使用。 我提交了票到SQLAlchemy的更新使用基于OAuth的司机rdbms_googleapi当不上谷歌应用程序引擎,就像Django的驱动程序在App Engine SDK中提供。 rdbms_googleapi还在于,DBAPI google_sql.py用途(远程SQL控制台)。

更新后的方言预计的0.7.10和0.8.0版本的一部分,但直到他们是可用的,你可以做到以下几点:


1 -在更新的方言复制票到一个文件中(前gaerdbms_dialect.py)

from sqlalchemy.dialects.mysql.mysqldb import MySQLDialect_mysqldb
from sqlalchemy.pool import NullPool
import re

"""Support for Google Cloud SQL on Google App Engine

Connecting
-----------

Connect string format::

    mysql+gaerdbms:///<dbname>?instance=<project:instance>


  # Example:
  create_engine('mysql+gaerdbms:///mydb?instance=myproject:instance1')
"""


class MySQLDialect_gaerdbms(MySQLDialect_mysqldb):

    @classmethod
    def dbapi(cls):
        from google.appengine.api import apiproxy_stub_map

        if apiproxy_stub_map.apiproxy.GetStub('rdbms'):
            from google.storage.speckle.python.api import rdbms_apiproxy
            return rdbms_apiproxy
        else:
            from google.storage.speckle.python.api import rdbms_googleapi
            return rdbms_googleapi

    @classmethod
    def get_pool_class(cls, url):
        # Cloud SQL connections die at any moment
        return NullPool

    def create_connect_args(self, url):
        opts = url.translate_connect_args()
        opts['dsn'] = ''  # unused but required to pass to rdbms.connect()
        opts['instance'] = url.query['instance']
        return [], opts

    def _extract_error_code(self, exception):
        match = re.compile(r"^(\d+):").match(str(exception))
        code = match.group(1)
        if code:
            return int(code)

dialect = MySQLDialect_gaerdbms

2 - 注册自定义方言(可以覆盖现有的模式)

from sqlalchemy.dialects import registry
registry.register("mysql.gaerdbms", "application.database.gaerdbms_dialect", "MySQLDialect_gaerdbms")

注意:0.8允许方言当前进程中注册(如上所示)。 如果你正在运行的SQLAlchemy的旧版本,我建议升级到0.8以上版本,或者您需要创建所概述单独安装的话在这里 。


3 -更新您的create_engine('...') URL作为项目和实例现在提供的URL的查询字符串的一部分

mysql+gaerdbms:///<dbname>?instance=<project:instance>

例如:

create_engine('mysql+gaerdbms:///mydb?instance=myproject:instance1')


Answer 2:

我想我有工作示例脚本如下。 你可以尝试类似的事情,让我知道怎么一回事呢?

但是(你可能已经意识到这一点),如果你的目标是要建立在谷歌Cloud SQL执行的模式,也许你可以创建针对本地MySQL服务器的架构,使用mysqldump转储,然后导入架构到谷歌Cloud SQL的。 利用当地的MySQL服务器是发展非常方便呢。

from sqlalchemy import create_engine
from google.storage.speckle.python.api import rdbms as dbi_driver
from google.storage.speckle.python.api import rdbms_googleapi

INSTANCE = 'YOURPROJECT:YOURINSTANCE'
DATABASE = 'YOURDATABASE'

def get_connection():       
    return rdbms_googleapi.connect('', instance=INSTANCE, database=DATABASE)

def main():
    engine = create_engine(
        'mysql:///YOURPROJECT:YOURINSTANCE/YOURDATABASE',
        module=dbi_driver,
        creator=get_connection,
    )
    print engine.execute('SELECT 1').scalar()

if __name__ == '__main__':
    main()


文章来源: Unable to connect to Google Cloud SQL from development server using SQLAlchemy