直接使用try...catch....結(jié)構(gòu)。比如:
創(chuàng)新互聯(lián)主營懷寧網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營網(wǎng)站建設(shè)方案,手機(jī)APP定制開發(fā),懷寧h5微信平臺(tái)小程序開發(fā)搭建,懷寧網(wǎng)站營銷推廣歡迎懷寧等地區(qū)企業(yè)咨詢
try
{
DB::query("SELECT?count(*)?FROM?pre_111?WHERE?fid?=?$fid";
}
catch(exception?$ex)
{
echo($ex-getMessage());
}
從Mysql 5.5 開始為我們提供了SIGNAL函數(shù)來實(shí)現(xiàn)這個(gè)功能。
[sql] view plain copy
CREATE TRIGGER `tg_order_create` AFTER INSERT ON `tp_order` FOR EACH ROW BEGIN
DECLARE msg varchar(200);
/*凍結(jié)金額*/
IF 2=NEW.condition THEN
UPDATE `tp_user` SET `frozen_amount`=`frozen_amount`+NEW.amount WHERE `id`=NEW.uid AND `amount`-`frozen_amount` NEW.amount;
/*如果余額不足,產(chǎn)生一個(gè)錯(cuò)誤*/
IF ROW_COUNT() 1 THEN
set msg = "用戶余額不足以完成支付.";
SIGNAL SQLSTATE 'HY000' SET MESSAGE_TEXT = msg;
END IF;
/*扣除金額*/
ELSEIF 3=NEW.condition THEN
UPDATE `tp_user` SET `amount`=`amount`-NEW.amount WHERE `id`=NEW.uid AND `amount`-`frozen_amount` NEW.amount;
/*如果余額不足,產(chǎn)生一個(gè)錯(cuò)誤*/
IF ROW_COUNT() 1 THEN
set msg = "用戶余額不足以完成支付.";
SIGNAL SQLSTATE 'HY000' SET MESSAGE_TEXT = msg;
END IF;
END IF;
END;
這里這條觸發(fā)器的功能是庫存操作,當(dāng)庫存足夠的時(shí)候 減少庫存,否則 拋出一個(gè)異常并報(bào)告商品庫存不足:
[sql] view plain copy
CREATE TRIGGER `TG_order_detail_dec_stock` BEFORE INSERT ON `tp_order_detail` FOR EACH ROW BEGIN
DECLARE msg VARCHAR(200);
UPDATE `tp_stock` SET `num`=`num`-NEW.num WHERE `goods_id`=NEW.goods_id AND `mid`=NEW.mid AND `num`=NEW.num;
IF ROW_COUNT() 1 THEN
SELECT CONCAT(`name`, ' 庫存不足.') INTO msg FROM `tp_goods` WHERE `id`=NEW.goods_id;
SIGNAL SQLSTATE 'HY000' SET MESSAGE_TEXT = msg;
END IF;
END;
在PHP端的處理(注:使用ThinkPHP框架):
[php] view plain copy
//前面省略若干行....
try {
if (false === ($order_pk = $tbl_order-add($order))) {
$tbl-rollback();
echo json_encode(array('success' = -1, 'message' = "創(chuàng)建訂單失敗!."), JSON_UNESCAPED_UNICODE);
return;
}
}catch (\PDOException $e){
$errInfo=$e-errorInfo[2];
$tbl-rollback();
echo json_encode(array('success' = -1, 'message' = "創(chuàng)建訂單失敗!,{$errInfo}"), JSON_UNESCAPED_UNICODE);
return;
}
//后面省略若干行....
DECLARE處理程序的使用:
DECLARE handler_type HANDLER FOR condition_value[,...] sp_statement
其中,
handler_type的取值范圍:CONTINUE | EXIT | UNDO
condition_value的取值范圍:SQLSTATE [VALUE] sqlstate_value | condition_name | SQLWARNING | NOT FOUND | SQLEXCEPTION | mysql_error_code
這個(gè)語句指定每個(gè)可以處理一個(gè)或多個(gè)條件的處理程序。如果產(chǎn)生一個(gè)或多個(gè)條件,指定的語句被執(zhí)行。?對(duì)一個(gè)CONTINUE處理程序,當(dāng)前子程序的執(zhí)行在執(zhí)行處理程序語句之后繼續(xù)。對(duì)于EXIT處理程序,當(dāng)前BEGIN...END復(fù)合語句的執(zhí)行被終止。UNDO 處理程序類型語句還不被支持。
· ? SQLWARNING是對(duì)所有以01開頭的SQLSTATE代碼的速記。
· ? ?NOT FOUND是對(duì)所有以02開頭的SQLSTATE代碼的速記。
· ? ?SQLEXCEPTION是對(duì)所有沒有被SQLWARNING或NOT FOUND捕獲的SQLSTATE代碼的速記。
注:除了SQLSTATE值,MySQL錯(cuò)誤代碼也不被支持。
例:
[sql]?view?plain?copy?print?
delimiter?$$??
CREATE?TABLE?`_t1`?(??
`id`?int(11)?NOT?NULL?AUTO_INCREMENT,??
`val1`?varchar(20)?DEFAULT?NULL,??
`val2`?int(11)?DEFAULT?NULL,??
PRIMARY?KEY?(`id`)??
)?ENGINE=InnoDB?AUTO_INCREMENT=113?DEFAULT?CHARSET=latin1$$
[sql]?view?plain?copy?print?
DELIMITER?$$??
CREATE?DEFINER=`abandonship`@`%`?PROCEDURE?`P_TestException`()??
BEGIN??
declare?_var,_err?int?default?0;??
declare?continue?handler?for?sqlexception,?sqlwarning,?not?found?set?_err=1;??
insert?into?_t1(val1,?val2)?value(2012,'abandonship');??
if?_err=1?then??
set?_var?=?2;??
end?if;??
select?case?when?_var?=?2?then?'出錯(cuò)了'?else?_var?end;
調(diào)用該存儲(chǔ)過程將返回:出錯(cuò)了
1.停止mysql服務(wù):
右鍵點(diǎn)擊“我的電腦”圖標(biāo),出現(xiàn)右鍵菜單后左鍵點(diǎn)擊“管理”。彈出“電腦管理”對(duì)話框后,左鍵點(diǎn)擊“服務(wù)與程序”,接著點(diǎn)擊“服務(wù)”,最后找到mysql服務(wù)并將其關(guān)閉。
2.進(jìn)入控制面板,點(diǎn)擊卸載程序,進(jìn)入卸載程序?qū)υ捒蚝笮遁dmysql。
3.組合鍵W+R進(jìn)入運(yùn)行,輸入“regedit”,查看下面 ?HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services 的鍵值,將mysql鍵值(mysql、mysqladmin)刪掉 。
4.重啟系統(tǒng)。
5.再次安裝mysql程序。
flask中向mysql中數(shù)據(jù)操作會(huì)出現(xiàn)字符集的問題,比如創(chuàng)建數(shù)據(jù)模型:db.create_all()時(shí),控制臺(tái)會(huì)出現(xiàn)warring 1366 的字符集警告,是這樣的:
這個(gè)異常是mysql問題,而非python的問題,這是因?yàn)閙ysql的字段類型是utf-xxx, 而在mysql中這些utf-8數(shù)據(jù)類型只能存儲(chǔ)最多三個(gè)字節(jié)的字符,而存不了包含四個(gè)字節(jié)的字符。
解決方法:
修改mysql數(shù)據(jù)表的字段類型為utf8mb4,只有在mysql5.5之后可以支持。
在flask配置中設(shè)置字符集:
SQLALCHEMY_DATABASE_URI = "mysql+pymysql://root:123456@127.0.0.1:3306/test?charset=utf8"
正常的下載和安裝教程網(wǎng)上很多,在此不贅述了,下面聊一下碰到的異常情況。
點(diǎn)擊execute后,出現(xiàn)圖中的叉叉后,不要慌,復(fù)制requirement下面的英文名稱,在網(wǎng)上搜索下載后,手動(dòng)安裝,安裝完成后,再點(diǎn)擊back,返回到上一步;然后再點(diǎn)擊next,紅叉叉全消失了。
下載地址:
盡管滿屏廣告,但不用擔(dān)心下載下來后,安裝一大堆垃圾!
python正常下載和安裝即可,vs如果到官網(wǎng)下,可能速度會(huì)很慢很慢,而且那幾個(gè)版本的文件都比較大,搞不好,會(huì)讓你下載到懷疑人生,當(dāng)然,從別的渠道還是能找到資源的。
總結(jié):1、安裝的過程中,首先要了解一點(diǎn)英文,否則是很難安裝下去的
2、碰到了異常,分析異常產(chǎn)生的原因,能否用其他方法解決?多去思考,多去嘗試
3、如果沒把握,最好先備份好系統(tǒng)
4、在折騰中提高
mysql下載的時(shí)候出現(xiàn)運(yùn)行環(huán)境異常是mysql服務(wù)沒有啟動(dòng)。
1、以管理員身份運(yùn)行cmd(左下角開始按鈕選擇以管理員身份運(yùn)行cmd即可)。
2、輸入:cdC:\ProgramFiles\MySQL\MySQLServer5.7\bin進(jìn)入mysql的bin文件夾。
3、輸入:mysqld-install(如果不用管理員身份運(yùn)行,將會(huì)因?yàn)闄?quán)限不夠而出現(xiàn)錯(cuò)誤:Install/RemoveoftheServiceDenied。)。
4、安裝成功。
5、運(yùn)行mysqld--initialize(標(biāo)題問題所在,若沒有init則不存在data目錄,自然無法啟動(dòng)成功)。
6、安裝成功后就要啟動(dòng)服務(wù)了,繼續(xù)在cmd中輸入:netstartmysql,服務(wù)啟動(dòng)成功。
7、服務(wù)啟動(dòng)成功之后,就可登錄了,輸入mysql-uroot-p經(jīng)常會(huì)遇到直接回車登陸不上的情況,原因在于5.7版本在安裝時(shí)自動(dòng)給了一個(gè)隨機(jī)密碼。