簡體   English   中英

無法從振動應用程序連接到MySQL / MariaDB數據庫

[英]Can't connect to MySQL/MariaDB database from vibed app

如果我使用自定義main( void main()而不是shared static this() ), shared static this()

使用默認主菜單時出現“訪問沖突”錯誤。 它看起來像MySQL不允許從localhost連接到它,但在my.ini中我添加了字符串:

bind-address = 127.0.0.1

代碼,如果有幫助:

import std.stdio;
import std.path;
import std.file;
import std.string;

import dini;
import vibe.d;
import colorize;
import ddbc.all;

shared static this()
{
    auto settings = new HTTPServerSettings;
    settings.port = 8080;
    settings.bindAddresses = ["::1", "127.0.0.1"];
    listenHTTP(settings, &hello);

    auto parseconfig = new ParseConfig();
    auto db = new DBConnect(parseconfig);
}

void hello(HTTPServerRequest req, HTTPServerResponse res)
{
    res.writeBody("Hello, World!");
}


class ParseConfig
{
    string dbname;
    string dbuser;
    string dbpass;
    string dbhost;
    string dbport;

this()
    {
        try
        {
            //getcwd do not return correct path if run from task shoulder
            string confpath = buildPath((thisExePath[0..((thisExePath.lastIndexOf("\\"))+1)]), "config.ini");
            //writefln(thisExePath[0..((thisExePath.lastIndexOf("\\"))+1)]); // get path without extention +1 is for getting last slash

            //string confpath = buildPath(thisExePath, "config.ini");
            if (!exists(confpath)) 
                {
                    writeln("ERROR: config.ini do not exists");
                }
            auto config = Ini.Parse(confpath);
            try
            {
                this.dbname = config.getKey("dbname");
                this.dbuser = config.getKey("dbuser");
                this.dbpass = config.getKey("dbpass");
                this.dbhost = config.getKey("dbhost");
                this.dbport = config.getKey("dbport");

            }
            catch (Exception msg)
            {
                cwritefln("ERROR: Can't parse config: %s".color(fg.red), msg.msg);
            }       
        }
        catch(Exception msg)
        {
            cwriteln(msg.msg.color(fg.red));
            core.thread.Thread.sleep( dur!("msecs")(1000));
        }   
    }


}


class DBConnect
{
    Statement stmt;
    ParseConfig parseconfig;

    this(ParseConfig parseconfig)
    {
        try
            {
                this.parseconfig = parseconfig;
                MySQLDriver driver = new MySQLDriver();
                string url = MySQLDriver.generateUrl(parseconfig.dbhost, to!short(parseconfig.dbport), parseconfig.dbname);
                string[string] params = MySQLDriver.setUserAndPassword(parseconfig.dbuser, parseconfig.dbpass);

                DataSource ds = new ConnectionPoolDataSourceImpl(driver, url, params);

                auto conn = ds.getConnection();
                scope(exit) conn.close();

                stmt = conn.createStatement();
                writefln("\n[Database connection OK]");
            }
        catch (Exception ex)
        {
            writefln(ex.msg);
            writeln("Could not connect to DB. Please check settings");
        }

    }   
}

我也運行下一個命令:

GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'password' WITH GRANT OPTION; FLUSH PRIVILEGES;

我也嘗試了不同的bind-address如: 0.0.0.0localhost但沒有結果。 每次新綁定后,我都重啟了MySQL服務。

我正在使用這個驅動程序http://code.dlang.org/packages/ddbc

怎么了?

繼續我的評論( 無法從振動應用程序連接到MySQL / MariaDB數據庫 )。

我剛剛測試過,它絕對是事件循環;)

代替:

auto parseconfig = new ParseConfig();
auto db = new DBConnect(parseconfig);

做就是了:

runTask({
    auto parseconfig = new ParseConfig();
    auto db = new DBConnect(parseconfig);
});

為我工作(DMD 2.067.0 / Vibe 0.7.23 / ddbc 0.2.24 / colorize&dini master)。

回答您的評論( 無法從振動應用程序連接到MySQL / MariaDB數據庫 ):事件循環在main函數內部啟動。 啟動D應用程序會發生什么? 入口點是運行時內部的C main,它初始化它(運行時),包括模塊構造函數,運行unittest(如果你用-unittest編譯),然后調用你的main(名字是“_Dmain” - 有用知道你是否想用GDB設置斷點。 當調用Vibe.d的main時,它會解析命令行參數,一個可選的配置文件,最后啟動事件循環。 希望在事件循環開始后運行的任何代碼都應該使用runTask和類似的,或createTimer 他們不應該直接從靜態構造函數調用代碼(這實際上是從Vibe.d開始時最常見的錯誤之一)。

我遇到了一個可能與開發mysql-lited (另一個MySQL / MariaDB驅動程序)相關的問題。

我認為這個問題與phobos / SHA1中的模塊初始化命令錯誤有關,我認為它仍然在2.067.1中打開。 建議的解決方法是使用VibeCustomMain,並定義自己的main()。 你可以從appmain.d復制defaul main()並使用它。

或者你可以嘗試mysql-lited ,看看它是否適合你。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM