如何从在Google App Engine SDK上运行的Python应用访问本地MySQL实例?

1 投票
2 回答
2312 浏览
提问于 2025-04-17 17:56

最近我在Google开发者学院的网站上学习“在Python App Engine中使用Google Cloud SQL”的教程。不过,在练习的第一部分“使用本地MySQL实例构建应用程序”时,我遇到了问题。我无法将示例代码(main.py)连接到我的本地MySQL实例。不知道有没有人找到了解决这个问题的方法。

如果你能告诉我你是怎么设置MySQL的,以及如何配置它,让GAE的沙箱能够访问MySQL-python连接器,那就太好了。

2 个回答

1

因为我是GAE、Python、MySQL的新手,并且是在Mac OS X上使用GAE开发,所以花了我一段时间才弄明白如何让示例应用程序正常工作。现在我找到了解决办法,想在这里分享一下,希望你能按照我的步骤在本地GAE SDK环境中和本地MySQL实例上运行示例应用程序。

我个人觉得这个过程非常有用,因为开发者在将应用程序部署到Google App Engine的云平台之前,通常会先在自己的机器上使用本地MySQL实例进行开发。

废话不多说,下面是我想分享的步骤:

  1. 从mysql.com社区网站下载并安装MySQL的dmg文件(我用的版本是mysql-5.5.30-osx10.6-x86_64.dmg)。

  2. 修改你的~/.profile文件,添加这些环境变量(添加以下几行): export PATH=/usr/local/mysql/bin:$PATH(或者根据你安装的MySQL版本进行调整) export DYLD_LIBRARY_PATH=/usr/local/mysql/lib/

  3. 如果你还没有安装Xcode,请从苹果的App Store安装。然后确保在偏好设置的“下载”部分安装“命令行工具”。这一步是必要的,因为它会安装一个gcc编译器(在我的文件系统中位置是:/usr/llvm-gcc-4.2/bin/llvm-gcc-4.2),用于在下面的第4步中构建MySQL-python连接器。

  4. 然后运行“sudo easy_install MySQL-python”(这样你就可以将应用程序连接到Mac上的本地MySQL实例)。

  5. 由于Google App Engine SDK for Python是一个沙盒环境,所以你需要在这个文件/usr/local/bin/dev_appserver.py中添加“import MySQLdb”,以便将GAE的沙盒环境与本地MySQL实例连接。你还需要在“main.py”文件的[示例代码][2]中进行以下更改,才能正确运行示例代码:

    • 在“import”部分添加“import MySQLdb”语句。
    • 将“CLOUDSQL_INSTANCE = ' '”语句替换为“CLOUDSQL_INSTANCE = 'localhost'”。
    • 需要重写“get_connection()”函数,因为MySQLdb包是与MySQL兼容的DB API v2.0接口。参数:“instance”、“database”和“password”在MySQLdb的“connect()”函数中是无法识别的。要使用MySQLdb包访问本地MySQL实例,你需要将“get_connection”函数重写为:
      
      def get_connection():
      return MySQLdb.connect(host=CLOUDSQL_INSTANCE, db=DATABASE_NAME,
      user=USER_NAME, passwd=PASSWORD, charset='utf8')
      
  6. 完成以上所有步骤后,你可以通过在应用程序目录中执行这个命令:“dev_appserver.py .”来启动示例应用程序。

  7. 如果你使用的是默认的8080端口,可以在浏览器中输入http://localhost:8080来访问。

  8. 祝你玩得开心。

1

我之前在一个项目中成功做到了这一点。步骤如下(适用于Windows系统):

  1. 安装mysql服务器,去MYSQL下载。在安装过程中,记得记录下用户名和密码,实例的名称应该类似于MySQL55,这个名称会根据你安装的版本有所不同。
  2. 下载并安装mysql的Python连接器,去MYSQL Python Connector下载。
  3. 确保Mysql服务器正在运行。
  4. 在你的应用程序中插入以下导入语句:

    from google.appengine.api import rdbms
    

5. 我创建了一个函数,用来返回数据连接,代码如下:

def conn_to_db():
return rdbms.connect(instance='MySQL55', database='Your_db_name_here', user='root', password='whatever_password_you_chose')

然后可以用来查询数据库,代码如下:

conn = conn_to_db()
cursor = conn.cursor()
cursor.execute('SELECT * FROM foo where foos = %s', (bar))
for row in cursor.fetchall():
    var1 = row[0]
    var2 = row[1]
conn.close()

撰写回答