You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Python mysql.connector连接DigitalOcean MySQL遇2005错误求助

解决mysql.connector连接DigitalOcean远程MySQL的Unknown Host错误

问题详情

使用Python的mysql.connector库连接DigitalOcean上的远程MySQL服务器时,触发DatabaseError,错误信息:

mysql.connector.errors.DatabaseError: 2005 (HY000): Unknown MySQL server host 'B.6dpp-api-db-do-user-12472806-0.b.db.ondigitalocean.com' (8)

已核对主机地址和认证信息准确性,但问题依旧。

相关代码

Flask后端代码

from flask import Flask, request, jsonify
import mysql.connector
from flask_cors import CORS

app = Flask(__name__)
CORS(app)

# Define a route to handle the form submission
@app.route('/personal_details', methods=['POST'])
def submit_personal_details():
    data = request.get_json()
    
    full_name = data.get('full_name')
    email = data.get('email')
    contact_number = data.get('contact_number')

    db = mysql.connector.connect(
    host = "",
    port = 25060,
    user = "hannah",
    password = "",
    database = "Users"
    )

    cursor = db.cursor()

    # Corrected SQL query with placeholders
    query = "INSERT INTO Users (name, email, contact) VALUES (%s, %s, %s)"
    values = (full_name, email, contact_number)

    cursor.execute(query, values)

    db.commit()

    cursor.close()
    db.close()

    return jsonify({'message': 'Successfully registered!'})

if __name__ == '__main__':
    app.run(debug=True)

Vue.js前端代码

<template>
  <div :class="$style.personalDetails">
    <div :class="$style.personalDetailsChild" />
    <div :class="$style.personalDetailsItem" />
    <div :class="$style.personalDetailsInner" />
    <div :class="$style.elevation05Parent">
      <div :class="$style.elevation05" />
      <b :class="$style.personalDetails1">
        <p :class="$style.yourPrivacyIs">Personal Details</p>
      </b>

      <!-- Form for personal details -->
      <form @submit.prevent="submitPersonalDetails">
        <b :class="$style.fullName">Full Name</b>
        <v-text-field
          :class="$style.inputBgVtextfield"
          v-model="formData.full_name"
          label="Full Name"
          required
        />

        <b :class="$style.email">Email</b>
        <v-text-field
          :class="$style.inputBgVtextfield1"
          v-model="formData.email"
          label="Email"
          required
        />

        <b :class="$style.contact">Contact</b>
        <div :class="$style.frameParent">
          <v-select
            :class="$style.frameVselect"
            v-model="formData.country_code"
            :items="['+60', '+61', '+62']"
            label="Code"
            color="#ffd600"
            required
          />
          <v-text-field
            :class="$style.inputBgVtextfield2"
            v-model="formData.phone_number"
            label="Phone Number"
            required
          />
        </div>

        <v-btn
          :class="$style.primaryButtonVbtn"
          color="#ffd600"
          variant="flat"
          type="submit"
          width="217"
          @click="submitPersonalDetails"
        >
          NEXT
        </v-btn>
      </form>
      <!-- End of form -->

    </div>
    <div :class="$style.yourPrivacyIsContainer">
      <p :class="$style.yourPrivacyIs">Your privacy is important to us.</p>
      <p :class="$style.yourPrivacyIs">
        We only need your phone number or email to send your redemption code.
      </p>
    </div>
    <img :class="$style.infoIcon" alt="" src="/info@2x.png" />
    <v-btn
      :class="$style.iconArrowLeft"
      color="#fff"
      size="x-large"
      variant="plain"
      prepend-icon="mdi-arrow-left"
      width="19.6"
      @click="onIconArrowLeftClick"
    />
    <v-btn
      :class="$style.homeVbtn"
      color="#000"
      variant="plain"
      width="41"
      href="/customer-home-page"
      @click="onHomeClick"
    >
      Home
    </v-btn>
  </div>
</template>

<script>
import { defineComponent } from "vue";

export default defineComponent({
  name: "PERSONALDETAILS",
  data() {
    return {
      formData: {
        full_name: "",
        email: "",
        country_code: "+60",
        phone_number: "",
      },
    };
  },
  methods: {
    onIconArrowLeftClick() {
      this.$router.push("/");
    },
    onHomeClick() {
      this.$router.push("/");
    },
    submitPersonalDetails() {
      this.formData.contact_number = this.formData.country_code + this.formData.phone_number;

      // Send the form data to Flask API
      fetch('/personal_details', {
        method: 'POST',
        headers: {
          'Content-Type': 'application/json',
        },
        body: JSON.stringify(this.formData),
      })
        .then(response => response.json())
        .then(data => {
          console.log(data);
        })
        .catch(error => {
          console.error(error);
        });
    },
  },
});
</script>

解决建议

  • 修正主机地址拼写:错误信息中的主机名开头多了B.前缀,核对DigitalOcean控制面板里的数据库主机地址,去掉多余的B.后重试。
  • 测试DNS解析:在运行Flask应用的服务器上执行nslookup 6dpp-api-db-do-user-12472806-0.b.db.ondigitalocean.com,确认域名能否正常解析到IP。如果解析失败,检查服务器DNS配置,或直接使用数据库的IP地址代替域名。
  • 验证防火墙规则:在DigitalOcean数据库控制面板的「Connections」页面,确认Flask应用所在服务器的公网IP已加入IP白名单,允许访问25060端口。
  • 检查网络连通性:在应用服务器上执行nc -zv 6dpp-api-db-do-user-12472806-0.b.db.ondigitalocean.com 25060,测试端口是否能连通。若不通,排查服务器出站防火墙是否允许访问25060端口。
  • 补全连接参数:后端代码中host和password字段为空,务必填入正确的主机地址和数据库密码,这是连接成功的基础。

内容的提问来源于stack exchange,提问作者Hannah Joshua

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 23:27:33