原來,mysql+gaerdbms:///
司機在SQLAlchemy的只是安裝使用rdbms_apiproxy
DBAPI,從谷歌應用程序引擎實例訪問谷歌雲SQL時才能使用。我向SQLAlchemy提交ticket以更新驅動程序,使其不在Google App Engine上時使用基於OAuth的rdbms_googleapi
,就像App Engine SDK中提供的Django driver一樣。 rdbms_googleapi也是google_sql.py
使用的DBAPI(遠程SQL控制檯)。
更新方言預計的0.7.10和0.8.0版本的一部分,但直到他們是可用的,你可以做到以下幾點:
1 - 更新的話複製在ticket到一個文件中(前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以上,否則您需要爲方言創建一個單獨的安裝,如here所述。
3 - 更新您的create_engine('...')
URL作爲項目和實例現在提供的URL
mysql+gaerdbms:///<dbname>?instance=<project:instance>
例如查詢字符串的一部分:
create_engine('mysql+gaerdbms:///mydb?instance=myproject:instance1')
你有沒有使用最新的SDK?我試着用SQLAlchemy 0.8.0發佈的方言和上面發佈的方言,並且仍然得到這裏描述的相同的錯誤:http://stackoverflow.com/questions/16192979/using-sqlalchemy-with-app-engine- and-google-cloud-sql-on-development-server – moraes
我發現了一個解決方法,並更新了你的方言:http://stackoverflow.com/a/16198395/125967 – moraes
對不起,通知評論和評論這個。當我使用本地mysql實例進行開發時,我是一個不同的連接字符串/驅動程序(只是默認的mysql://(mysql-python)驅動程序),並且在我的產品或ProductionDeploy配置中使用mysql + gaerdbms時, Flask-Script項目。我通常也不使用dev_appserver,而只使用標準的WSGI服務器。看起來像一個值得向上推進到SQLAlchemy的好改變。 –