2014-04-06 27 views
2

我試圖將django 1.3應用程序移植到AppEngine + Google Cloud SQL。但是我在從本地開發django連接到我的cloudSQL實例時遇到了一些問題。無法在Google CloudSQL上運行syncdb

我可以使用dbshell連接到CloudSQL。它顯示了瀏覽器身份驗證,並在提示符下丟棄。

(ENV)$ SETTINGS_MODE=prod ./manage.py dbshell 
Google SQL Client 

Type "help" or "?" for help. 

Connecting to Google SQL database "my_project:prod1|my_db" on host None. 
Using readline for history management. 
Loading history file "/Users/user/.googlesql/django_proj#prod1.hist" 
sql> SELECT CURRENT_USER(); 
Execution time: 0.694 seconds 
+----------------+ 
| CURRENT_USER() | 
+----------------+ 
| [email protected] | 
+----------------+ 

我認爲這是奇怪的是,似乎dbshel​​l實際上以root用戶運行的,即使我有我的settings.py文件中沒有root密碼。但是,它仍然有效。

當我嘗試運行syncdb時失敗。

(ENV)$ SETTINGS_MODE=prod ./manage.py syncdb 
Traceback (most recent call last): 
    File "./manage.py", line 11, in <module> 
    execute_manager(settings) 
    File "/usr/local/google_appengine/lib/django-1.3/django/core/management/__init__.py", line 438, in execute_manager 
    utility.execute() 
    File "/usr/local/google_appengine/lib/django-1.3/django/core/management/__init__.py", line 379, in execute 
    self.fetch_command(subcommand).run_from_argv(self.argv) 
    File "/usr/local/google_appengine/lib/django-1.3/django/core/management/base.py", line 191, in run_from_argv 
    self.execute(*args, **options.__dict__) 
    File "/usr/local/google_appengine/lib/django-1.3/django/core/management/base.py", line 220, in execute 
    output = self.handle(*args, **options) 
    File "/usr/local/google_appengine/lib/django-1.3/django/core/management/base.py", line 351, in handle 
    return self.handle_noargs(**options) 
    File "/usr/local/google_appengine/lib/django-1.3/django/core/management/commands/syncdb.py", line 56, in handle_noargs 
    cursor = connection.cursor() 
    File "/usr/local/google_appengine/lib/django-1.3/django/db/backends/__init__.py", line 252, in cursor 
    cursor = util.CursorWrapper(self._cursor(), self) 
    File "/usr/local/google_appengine/google/storage/speckle/python/django/backend/base.py", line 275, in _cursor 
    self.connection = Connect(**kwargs) 
    File "/usr/local/google_appengine/google/storage/speckle/python/django/backend/base.py", line 200, in Connect 
    return driver.connect(**kwargs) 
    File "/usr/local/google_appengine/google/storage/speckle/python/api/rdbms_googleapi.py", line 183, in __init__ 
    super(GoogleApiConnection, self).__init__(*args, **kwargs) 
    File "/usr/local/google_appengine/google/storage/speckle/python/api/rdbms.py", line 812, in __init__ 
    self.OpenConnection() 
    File "/usr/local/google_appengine/google/storage/speckle/python/api/rdbms.py", line 835, in OpenConnection 
    response = self.MakeRequest('OpenConnection', request) 
    File "/usr/local/google_appengine/google/storage/speckle/python/api/rdbms.py", line 946, in MakeRequest 
    raise _ToDbApiException(response.sql_exception) 
google.storage.speckle.python.api.rdbms.OperationalError: (1045, u"Access denied for user 'my_prod_user'@'localhost' (using password: YES)") 

在這種情況下,您可以看到它嘗試使用我的真實用戶而不是根用戶。並且拒絕訪問失敗。

如果我嘗試使用my_prod_user直接連接到雲SQL,它工作得很好。

$ mysql -h XXX.XXX.XXX.XXX -u my_prod_user -p 
Enter password: 
Welcome to the MySQL monitor. Commands end with ; or \g. 
Your MySQL connection id is 8 
Server version: 5.5.36 (Google) 

Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. 

Oracle is a registered trademark of Oracle Corporation and/or its 
affiliates. Other names may be trademarks of their respective 
owners. 

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. 

mysql> SELECT CURRENT_USER(); 
+-----------------+ 
| CURRENT_USER() | 
+-----------------+ 
| [email protected]% | 
+-----------------+ 
1 row in set (0.19 sec) 

有沒有人遇到過這個?

回答

1

我的問題是我設置settings.py文件的方式。似乎通過本地機器訪問您的CloudSQL數據庫時,您必須使用用戶root。此外,本地密碼似乎沒有任何區別,因爲它可能只是使用oAuth標記來創建連接。

爲了將來的參考,這裏是我從本地開發機器訪問CloudSQL的工作設置。

DATABASES = { 
    'default': { 
    'ENGINE': 'google.appengine.ext.django.backends.rdbms', 
    'INSTANCE': 'project-name:instance', 
    'NAME': 'my_db', 
    'USER': 'root', 
    } 
} 

這裏是我以前使用的破碎的。請注意我的密碼是怎樣內嵌的。傻我。

DATABASES = { 
    'default': { 
    'ENGINE': 'google.appengine.ext.django.backends.rdbms', 
    'INSTANCE': 'project-name:instance', 
    'NAME': 'my_db', 
    'USER': 'my_prod_user', 
    'PASSWORD' : 'myVerySecretPassword', 
    } 
} 

我想Google會討厭密碼。我很高興我的應用程序中不再需要這些硬編碼。

0

使用Django == 1.10.4,這裏是我用來連接的設置。請注意主機和密碼。

DATABASES = { 
    'default': { 
     'ENGINE': 'django.db.backends.mysql', 
     'HOST': 'ip_address', 
     'NAME': 'db_name', 
     'USER': 'root', 
     'PASSWORD': 'password' 
    } 
} 

而且新的命令是:

SETTINGS_MODE=prod python manage.py migrate 
相關問題