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

请求提供Mojolicious框架Model创建、SQL查询及结果传递示例

完整的Mojolicious Model+SQL查询示例

我来帮你把思路落地,解决Mojolicious里Model创建和SQL查询的问题。你原来的方向是对的,但有些细节(比如数据库连接的作用域、方法返回值)需要调整,以下是可以直接参考的完整示例:

1. 修正后的Model代码(LS/Model/Dt.pm)

首先,Model需要正确管理数据库连接,确保查询方法能拿到有效的数据库句柄,并且返回查询结果:

package LS::Model::Dt;
use Mojo::Base -base;
use DBI;

# 私有方法:封装数据库连接逻辑
sub _connect {
    my $self = shift;
    my $user = 'user_sql';
    my $pass = 'pass_sql';
    my $dsn = "dbi:Sybase:server=db.sql-srv.com;database=Adventure";
    
    # 建立连接并配置基础参数,方便错误调试
    my $dbh = DBI->connect($dsn, $user, $pass, {
        RaiseError => 1, # 自动抛出错误,替代手动die
        AutoCommit => 1, # 默认自动提交事务,按需调整
        PrintError => 0
    }) or die "数据库连接失败: $DBI::errstr";
    
    return $dbh;
}

# 公开方法:执行查询并返回结果
sub get_all_foo {
    my $self = shift;
    my $dbh = $self->_connect;
    
    my $query = "SELECT * FROM foo";
    # 用Slice => {} 返回哈希数组,后续视图处理更直观
    my $results = $dbh->selectall_arrayref($query, { Slice => {} });
    
    # 单次查询后关闭连接(如果需要长连接可以改用连接池)
    $dbh->disconnect;
    
    return $results;
}

1;

这里的关键调整:

  • 用_connect私有方法封装连接逻辑,避免重复代码
  • 给DBI->connect添加参数优化错误处理
  • get_all_foo明确返回查询结果,解决你原代码里无返回值的问题

2. Controller调用Model(LS/Controller/Home.pm)

在Controller里,你需要实例化Model、调用查询方法,再把结果传递给视图:

package LS::Controller::Home;
use Mojo::Base 'Mojolicious::Controller';
use LS::Model::Dt;

sub home {
    my $self = shift;
    
    # 实例化Model对象
    my $dt_model = LS::Model::Dt->new;
    # 调用查询方法获取数据
    my $foo_data = $dt_model->get_all_foo;
    
    # 将数据传给视图,变量名可自定义(这里用foo_data)
    $self->render(template => 'home/index', foo_data => $foo_data);
}

1;

3. 视图展示结果(templates/home/index.html.ep)

最后在视图里循环渲染查询到的数据(根据你的表字段调整):

<h1>Foo表数据</h1>

% if (@$foo_data) {
    <table border="1">
        <thead>
            <tr>
                <!-- 替换成你foo表的实际字段名 -->
                <th>ID</th>
                <th>名称</th>
            </tr>
        </thead>
        <tbody>
            % foreach my $row (@$foo_data) {
                <tr>
                    <td><%= $row->{id} %></td>
                    <td><%= $row->{name} %></td>
                </tr>
            % }
        </tbody>
    </table>
% } else {
    <p>暂无数据</p>
% }

额外提示

  • 频繁查询的场景建议用连接池(比如Mojo::DBI),避免每次查询都重建连接,提升性能
  • 不要硬编码数据库密码,可存到Mojolicious的配置文件里,用$self->config->{db_user}这类方式读取

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:00:27