例如我有桌子
create table emp(
empno integer,
ename character varying(255),
job character varying(255),
mgr integer,
hiredate timestamp without time zone,
sal double pricision,
comm integer,
deptno integer
)
当我尝试插入
之类的数据时insert into emp (empno,ename,job,mgr,hiredate,sal,comm,deptno) values (1,'abc','abc','e','2018-10-12 00:00:00',50.50,1,'f');
这会给我一个invalid text representation 7 error invalid input syntax for integer
的错误,因为我已经为mgr
和deptno
插入了字符串值,只能通过查看值才能找到,但是posgresql并没有给我确切的值遇到此问题的列名。有什么办法可以在错误消息本身中获取列名。因为当我们有超过50到60列时,很难找到真正有问题的列。
答案 0 :(得分:7)
您不必找出哪一列是错误的,因为在插入数据库之前,应确保输入的格式正确。
您正在使用Laravel,因此应利用其提供的强大工具集进行验证:https://laravel.com/docs/5.8/validation
例如,在您的情况下,应在控制器的开头使用以下规则来验证mgr
:
$request->validate([
'mgr' => 'number'
]);
如果不遵守规则,将引发异常,因此,当用户尝试输入数据时,而不是在后端尝试将数据插入数据库时,失败。
答案 1 :(得分:5)
您可以使用类\Illuminate\Database\QueryException
捕获sql查询异常,并可以根据需要自定义sql异常。
try {
// Add your insert query here.
} catch (\Illuminate\Database\QueryException $e) {
// Here you can get the sql exception details.
dd($e->getMessage(), $e->errorInfo); // print for the details info.
// customzie you error
} catch (\Exception $e) {
// for the other exception.
dd($e->getMessage(), $e->errorInfo); // print for the details info.
}
您还可以使用Laravel异常处理在公共位置自定义消息。