d - 无法从 vibed 应用程序连接到 MySQL/MariaDB 数据库



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

使用默认的主我遇到"访问违规"错误。看起来MySQL不允许从localhost连接到它,但是在我的.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

怎么了?

继续我的评论(无法通过Vibed应用程序连接到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)。

回答您的评论(无法通过Vibed应用程序连接到MySQL/MariadB数据库):事件循环在主函数内部启动。启动D应用程序时会发生什么?输入点是运行时内的C主,该输入点初始化它(包括模块构造函数在内的运行时),运行UNITSEST(如果您使用-1-1-1-1),请致电您的MAIN(哪个名称为" _DMain" - 有用要知道是否要使用GDB设置断点)。当调用Vibe.d的Main时,它解析了命令行参数,一个可选的配置文件,最后启动事件循环。事件循环启动后希望运行的任何代码都应使用runTask和类似的createTimer。他们不应直接从静态构造函数调用代码(从vibe.d开始时,这实际上是最常见的错误之一)。

我遇到了一个问题,该问题可能是在开发mysql-lided(另一种MySQL/Mariadb驱动程序)时与之相关的。

我认为的问题与Phobos/SHA1中的模块初始化订单错误有关,我认为该错误仍在2.067.1中打开。建议的工作是使用VibeCustommain,并定义您自己的Main()。您只需从appmain.d复制defaul main()并使用它。

另外,您可以尝试MySQL命令,看看是否对您有用。

相关内容

  • 没有找到相关文章

最新更新