mysql 使用python连接到cloudsql时出错

pu3pd22g  于 2023-10-15  发布在  Mysql
关注(0)|答案(3)|浏览(132)

我是一个新手到这个谷歌应用程序引擎。我写了一个小的python代码,用于连接google cloud中的数据库。不幸的是,我得到了这个错误。

Traceback (most recent call last):
File "/home/revanth/Projects/workspace/project2/connect.py", line 28, in  <module>
main()
File "/home/revanth/Projects/workspace/project2/connect.py", line 19, in main
user='revanth'
File "/usr/lib/python2.7/dist-packages/MySQLdb/__init__.py", line 81, in Connect
return Connection(*args, **kwargs)
File "/usr/lib/python2.7/dist-packages/MySQLdb/connections.py", line 187, in __init__
super(Connection, self).__init__(*args, **kwargs2)
 _mysql_exceptions.OperationalError: (1045, "Access denied for user 'revanth'@'76.183.80.171' (using password: NO)")

下面是我的Python代码

import googleapiclient
import MySQLdb
import os
#from google.storage.speckle.python.api import rdbms_googleapi

def main():           
 env = os.getenv('SERVER_SOFTWARE')
if (env and env.startswith('Google App Engine/')):
  # Connecting from App Engine
  db = MySQLdb.connect(
    unix_socket='/cloudsql/citric-cistern-97118:geoeq',
    user='revanth')
  else:
  # Connecting from an external network.
  # Make sure your network is whitelisted
  db = MySQLdb.connect(
    host='173.194.232.179',
    port=3306,
    user='revanth'
    )

cursor = db.cursor()
cursor.execute('select * from Whether')
rows = cursor.fetchall()
print rows 

if __name__ == '__main__':
 main()

请帮帮我

xjreopfe

xjreopfe1#

要授予对App Engine应用程序的访问权限,请执行以下操作:

  • 转到Google Developers Console,然后单击项目名称选择项目。
  • 在左侧的边栏中,单击Storage > Cloud SQL以显示项目的Cloud SQL示例列表。
  • 找到要授予访问权限的示例,然后单击示例名称。
  • 单击编辑。
  • 在“授权的App Engine应用程序”框中,输入一个或多个Google App Engine应用程序ID。

注意:为了保证低延迟,可以通过在创建示例时选择首选位置或配置现有示例,使Google Cloud SQL示例尽可能靠近指定的App Engine应用程序。这仅适用于在美国和欧盟地区创建的示例。单击“保存”以应用更改。

llycmphe

llycmphe2#

我认为你的import MySQLdb有兼容性问题。我在Google Cloud Run中遇到了同样的问题。我的代码运行在本地机器是好的,但运行在云运行有错误“mysql.connector.errors.DatabaseError:2003年(HY000):无法连接到MySQL服务器上'34.105.87.213:3306'(110)”
我改到sqlalchemy lib,这个问题就解决了。
旧lib:

import os
import mysql.connector

HOMAPP_NEWS_URL = "xxxxxxxx"

def write_to_db(contents):
    # MySQL数据库连接配置
    config = {
        'host': os.environ.get("HOST"),
        'port': os.environ.get("PORT"),
        'database': os.environ.get("DB_NAME"),
        'user': os.environ.get("DB_USER"),
        'password': os.environ.get("DB_PASS"),
        'raise_on_warnings': True
    }

# 连接到MySQL数据库
conn = mysql.connector.connect(**config)
cursor = conn.cursor()

for content in contents:
    # 遍历contents数组,并将数据写入MySQL数据库
    for news in content:
        # 准备SQL插入语句
        insert_query = "INSERT INTO t_news (source, title, content, url, pics, type, status, update_date) VALUES (%s, %s, %s, %s, %s, %s, %s, %s)"
        insert_values = (news.source, news.title, news.content, news.url, HOMAPP_NEWS_URL, news.type, news.status, news.update)

        # 执行SQL插入语句
        cursor.execute(insert_query, insert_values)
        conn.commit()

# 关闭数据库连接
cursor.close()
conn.close()
print("Write db completed")

新库:

import os
import sqlalchemy

HOMAPP_NEWS_URL = "XXXXXXXXXX"

def write_to_db(contents):
    # MySQL数据库连接配置
    db_user = os.environ["DB_USER"]  # e.g. 'my-database-user'
    db_pass = os.environ["DB_PASS"]  # e.g. 'my-database-password'
    db_name = os.environ["DB_NAME"]  # e.g. 'my-database'
    unix_socket_path = os.environ["INSTANCE_CONNECTION_NAME"]  # e.g. '/cloudsql/project:region:instance'

pool = sqlalchemy.create_engine(
    # Equivalent URL: mysql+pymysql://<db_user>:<db_pass>@/<db_name>?unix_socket=<socket_path>/<cloud_sql_instance_name>
    sqlalchemy.engine.url.URL.create(
        drivername="mysql+pymysql",
        username=db_user,
        password=db_pass,
        database=db_name,
        query={"unix_socket": unix_socket_path},
    ),
)

# 连接到MySQL数据库
with pool.connect() as conn:
    stmt = sqlalchemy.text(
        f"INSERT INTO t_news (source, title, content, url, pics, type, status, update_date)"
        " VALUES (:source, :title, :content, :url, :pics, 'Repost', 'Publish', :update_date)"
    )

    # 遍历contents数组,并将数据写入MySQL数据库
    for content in contents:
        for news in content:
            # 执行SQL语句
            conn.execute(stmt, {
                'source': news.source,
                'title': news.title,
                'content': news.content,
                'url': news.url,
                'pics': HOMAPP_NEWS_URL,
                'update_date': news.update
            })                
            conn.commit()

# 关闭数据库连接
conn.close()
print("Write db completed")
gwbalxhn

gwbalxhn3#

我想出了解决办法。我只需要添加0.0.0.0/0允许所有外部IP地址连接它。
这里是链接:https://cloud.google.com/sql/docs/access-control
我需要在选项中指定密码。

相关问题