【问题标题】:Illuminate\Database\QueryException: SQLSTATE[42S02]: Base table or view not found: 1146 Table &#03 (truncatedIlluminate\Database\QueryException: SQLSTATE[42S02]: Base table or view not found: 1146 Table &#03 (truncated
【发布时间】:2021-01-29 06:32:13
【问题描述】:

我使用 Laravel v5.8 创建了一个 API。 这个 API 有一个端点,它接收一些参数并在数据库表上创建 1 行。 当我使用 Postman 调用此端点时,它可以工作。

但是…… 我使用 Laravel 5.8 创建了一个应用程序,当此应用程序尝试调用发送相同参数和标头的 API 端点时,会显示此错误:

“Illuminate\Database\QueryException: SQLSTATE[42S02]: Base table or view not found: 1146 Table (truncated...”

该表应该是“api_log”,但我在错误消息中看不到这个名称。

注意:此错误仅在本地环境中发生。

Laravel 应用正在使用 GuzzleHttp 调用 API。

APP 请求:

$client = new \GuzzleHttp\Client();
$res = $client->request('POST', 'http://project.local/v1/api_log', [
'headers' => [
'Content-Type' => 'application/x-www-form-urlencoded',
'Authorization' => $_ENV['API_TOKEN']
],
'form_params' => [
'json' => $json_request
]
]);

API 控制器中的 MySQL 语句(未使用模型):

$sql = "INSERT INTO api_log (user_id, environment, start_datetime, end_datetime, requested_api, processing_time, activity_id, ip_address, request_data, response_data, credits) VALUES (".$user_id.",'".$env."','".$start_datetime."','".$end_datetime."',".$requested_api.",".$processing_time.",'".$activity_id."','".$ip_address."','".$request_data."','".$response_data."',".$credits.")";            

$insert_log = DB::connection('mysql_log')->statement($sql);

我已经尝试过使用这样的模型,但没有成功:

class ApiLog extends Model
{
    protected $connection = 'mysql_log';
    protected $table = 'api_log';
}

我正在为 API 和 APP 使用普通的 http://localhost/... 域。 我尝试将 API 包装到像 http://project.local 这样的虚拟主机中,但显示了相同的错误。

有什么线索吗?谢谢。

【问题讨论】:

    标签: php mysql laravel


    【解决方案1】:

    嗯...经过很多小时后,我通过查看 Laravel 日志文件解决了这个问题。

    问题出在 .env 文件中。

    .env 文件有以下几行:

    ALTER_CONNECTION=mysql_log
    ALTER_HOST=127.0.0.1
    ALTER_PORT=3306
    ALTER_DATABASE=my_db
    ALTER_USERNAME=root
    ALTER_PASSWORD=my_pass
    

    我已经通过以下方式对其进行了更改:

    ALT_CONNECTION=mysql_log
    ALT_HOST=127.0.0.1
    ALT_PORT=3306
    ALT_DATABASE=my_db
    ALT_USERNAME=root
    ALT_PASSWORD=my_pass
    

    我认为这些变量名称已被捕获(我不知道为什么),因此数据库配置失败。

    谢谢大家。

    【讨论】:

    • 如有疑问:php artisan cache:clear php artisan config:cache... config:cache 在更改配置文件或 .env 文件时是必需的。有时它可以在没有的情况下运行,但通常最好只运行它。
    【解决方案2】:

    很遗憾,我无法发表评论。但是您似乎没有在数据库配置文件中指定连接mysql_log。要使用$connectionDB::connection(),您必须在config/database.php 中指定连接

    如果您这样做了,请检查您的值是否正确放入文件中。明智的做法是为数据库/用户名/密码使用不同的constant,而不是通过应用程序运行的其他连接。

    'connections' => [
        // New connection
        'mysql_log' => [
            'driver' => 'mysql',
            'url' => env('DATABASE_URL'),
            'host' => env('MYSQL_LOG_HOST', '127.0.0.1'),
            'port' => env('MYSQL_LOG_PORT', '3306'),        
            'database' => env('MYSQL_LOG_DATABASE', 'DB2'),
            'username' => env('MYSQL_LOG_USERNAME', 'DB2'),
            'password' => env('MYSQL_LOG_PASSWORD', 'PASS'),
            'unix_socket' => env('DB_SOCKET', ''),
            'charset' => 'utf8mb4',
            'collation' => 'utf8mb4_unicode_ci',
            'prefix' => '',
            'prefix_indexes' => true,
            'strict' => true,
            'engine' => null,
            'options' => extension_loaded('pdo_mysql') ? array_filter([
                PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
            ]) : [],
        ],
    
    
        // Typical primary connection
        'mysql' => [
            'driver' => 'mysql',
            'url' => env('DATABASE_URL'),
            'host' => env('DB_HOST', '127.0.0.1'),
            'port' => env('DB_PORT', '3306'),
            'database' => env('DB_DATABASE', 'forge'),
            'username' => env('DB_USERNAME', 'forge'),
            'password' => env('DB_PASSWORD', ''),
            'unix_socket' => env('DB_SOCKET', ''),
            'charset' => 'utf8mb4',
            'collation' => 'utf8mb4_unicode_ci',
            'prefix' => '',
            'prefix_indexes' => true,
            'strict' => true,
            'engine' => null,
            'options' => extension_loaded('pdo_mysql') ? array_filter([
                PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
            ]) : [],
        ],
    ]
    

    将连接添加到配置后,您可以运行php artisan config:cache 以确保正确缓存新配置。

    【讨论】:

    • 谢谢汤姆,已经完成了。如果我使用邮递员向 API 发出请求,它工作正常。所以数据库连接正在工作。缓存也已经清空了。
    • 但是使用Guzzle从APP调用API,在我的本地环境中不起作用。它仅适用于在线服务器。我不知道为什么。
    • 我认为您的本地环境中缺少该表,或者您的配置中未正确指向数据库服务器。除此之外,我不太确定。对不起,没有看到你已经在邮递员中提出了请求,所以我并没有真正帮助。 :(
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-04
    • 2019-06-06
    • 2020-09-30
    • 2018-02-21
    相关资源
    最近更新 更多