看你的數(shù)據(jù)庫(kù)設(shè)置應(yīng)該是沒(méi)有問(wèn)題的。因?yàn)槲以谑褂胓orm的時(shí)候是開(kāi)啟了數(shù)據(jù)庫(kù)連接池,因此我沒(méi)有在一個(gè)地方專(zhuān)門(mén)對(duì)db進(jìn)行close。我不知道你代碼里面db的生命周期是怎么樣的。建議你在調(diào)試環(huán)境中使用db = db.Debug(),可以打印要執(zhí)行的sql語(yǔ)句。此外,還可以在你的代碼中通過(guò)err := db.Save(&like).Error, 檢出err查看你程序的執(zhí)行是否有問(wèn)題.
======補(bǔ)充================
package database
var db *gorm.DB
func init() {
var dbSrc = "username:password.@(127.0.0.1:3309)/gotest?charset=utf8&parseTime=True&loc=Local"
newDb, err := gorm.Open("mysql", dbSrc)
if err != nil {
panic(err)
}
db = newDb
sqlDb := db.DB()
sqlDb.SetMaxOpenConns(100)
sqlDb.SetMaxIdleConns(15)
if gin.IsDebugging() {
db = db.Debug()
}
}
func DB() *gorm.DB {
return db.New()
}
一般情況下我會(huì)將數(shù)據(jù)庫(kù)的初始化工作放到一個(gè)init中,然后在包含main函數(shù)的文件中導(dǎo)入這個(gè)包(package),這里就舉個(gè)例子:
import _ "database"
這樣在程序啟動(dòng)的時(shí)候, 就會(huì)會(huì)自動(dòng)初始化db(而且不用擔(dān)心會(huì)初始化多次)。然后在需要使用的地方只需要調(diào)用
db := database.DB()
這樣可以拿到一個(gè)db對(duì)象。
mongorestore是個(gè)獨(dú)立的可執(zhí)行程序,請(qǐng)不要在進(jìn)入mongodb的命令行狀態(tài)中執(zhí)行它!
單獨(dú)打開(kāi)一個(gè)命令行窗口執(zhí)行你的命令即可。
沒(méi)看懂你要啥...?
這是你想要的么?
insert into table001 (id, p_id, name, length) values
(110,1,'網(wǎng)絡(luò)銷(xiāo)售',10),
(111,1,'區(qū)域銷(xiāo)售',11),
(112,1,'渠道專(zhuān)員',12),
(113,1,'渠道經(jīng)理/總監(jiān)',13),
(114,1,'客戶(hù)經(jīng)理/主管',14),
(115,1,'大客戶(hù)經(jīng)理',15),
(116,1,'團(tuán)購(gòu)業(yè)務(wù)員/經(jīng)理',16),
(117,1,'會(huì)籍顧問(wèn)',17),
(201,2,'客服專(zhuān)員/助理',18),
(202,2,'客服經(jīng)理/主管',19),
(203,2,'客服總監(jiān)',20);
EDITED
上面的sql是通過(guò)下面的腳本生成的
var arrays = new Array();
var sorts= new Array();
var jobs="銷(xiāo)售 銷(xiāo)售代表 銷(xiāo)售助理 銷(xiāo)售經(jīng)理/主管 銷(xiāo)售總監(jiān) 電話(huà)銷(xiāo)售 銷(xiāo)售支持 汽車(chē)銷(xiāo)售 醫(yī)藥代表 醫(yī)療器械銷(xiāo)售 網(wǎng)絡(luò)銷(xiāo)售 區(qū)域銷(xiāo)售 渠道專(zhuān)員 渠道經(jīng)理/總監(jiān) 客戶(hù)經(jīng)理/主管 大客戶(hù)經(jīng)理 團(tuán)購(gòu)業(yè)務(wù)員/經(jīng)理 會(huì)籍顧問(wèn)\n"+
"客服 客服專(zhuān)員/助理 客服經(jīng)理/主管 客服總監(jiān) 售前/售后服務(wù) 電話(huà)客服 客戶(hù)關(guān)系管理\n"+
"貿(mào)易/采購(gòu) 外貿(mào)專(zhuān)員/助理 外貿(mào)經(jīng)理/主管 采購(gòu)員 采購(gòu)助理 采購(gòu)經(jīng)理/總監(jiān) 報(bào)關(guān)員 商務(wù)專(zhuān)員/經(jīng)理 買(mǎi)手\n"+
"超市/百貨/零售 店員/營(yíng)業(yè)員 收銀員 促銷(xiāo)/導(dǎo)購(gòu)員 理貨員/陳列員 防損員/內(nèi)保 店長(zhǎng)/賣(mài)場(chǎng)經(jīng)理 招商經(jīng)理/主管 奢侈品業(yè)務(wù) 品類(lèi)管理 食品加工/處理 督導(dǎo)\n"+
"市場(chǎng)/媒介/公關(guān) 市場(chǎng)專(zhuān)員/助理 市場(chǎng)經(jīng)理/總監(jiān) 市場(chǎng)拓展 市場(chǎng)調(diào)研 市場(chǎng)策劃 媒介專(zhuān)員/助理 媒介經(jīng)理/主管 會(huì)務(wù)會(huì)展專(zhuān)員/經(jīng)理 品牌專(zhuān)員/經(jīng)理 公關(guān)專(zhuān)員/助理 公關(guān)經(jīng)理/主管 企劃經(jīng)理/主管\n"+
"廣告/會(huì)展/咨詢(xún) 廣告文案 創(chuàng)意指導(dǎo)/總監(jiān) 廣告設(shè)計(jì)/制作 廣告創(chuàng)意 媒介策劃/管理 會(huì)展策劃/設(shè)計(jì) 婚禮策劃師 咨詢(xún)顧問(wèn) 咨詢(xún)經(jīng)理/主管 客戶(hù)主管/專(zhuān)員 企業(yè)策劃\n"+
"美術(shù)/設(shè)計(jì)/創(chuàng)意 美編/美術(shù)設(shè)計(jì) 服裝設(shè)計(jì) 家具/家居用品設(shè)計(jì) 平面設(shè)計(jì) 美術(shù)指導(dǎo) 店面/陳列/展覽設(shè)計(jì) 工藝/珠寶設(shè)計(jì) 多媒體/動(dòng)畫(huà)設(shè)計(jì) 產(chǎn)品/包裝設(shè)計(jì) 裝修裝潢設(shè)計(jì) CAD設(shè)計(jì)/制圖";
var sa = jobs.split("\n");
var k=0;
for(var j=0; j<sa.length; j++){
names = sa[j].split(" ");
sorts[j] = new Array(""+(j+1), names[0]);
for(var m=0; m<names.length-1;m++)
arrays[k++] = new Array(""+(j+1),(j+1)*100+(m+1), names[m+1])
}
function makesql(arr){
var a;
console.log("insert into table001 (id, p_id, name, length) values");
for(var i=0; i<arr.length; i++){//a為index
item =arr[i];
var parentid=0;
var name=item[1];
var classid=item[0];
if(item.length == 3){
parentid= item[0];
classid=item[1];
name =item[2];
}
console.log("("+classid+","+parentid+",'"+name+"',"+(i+1)+")"+(i==arr.length-1?";":","));
}
}
//console.log("delete from table001;");
makesql(sorts);
makesql(arrays);
不需要什么開(kāi)發(fā)環(huán)境, 打開(kāi)瀏覽器->按F12打開(kāi)開(kāi)發(fā)者工具
-> 切到console
->粘貼->按Enter. SQL就生成了.
當(dāng)然,存成文件用nodejs執(zhí)行更好一些.
jdbc URL里加上rewriteBatchedStatements=true
這個(gè)參數(shù)就可以了。
或者,在程序?qū)懗梢粭lINSERT插入多行數(shù)據(jù)的形式,不用依賴(lài)jdbc的batch功能,這樣是最靠譜的,也適合移植到MySQL以外的數(shù)據(jù)庫(kù)。
student.aggregate([
{
$match:{stunum:'1'}
},{
$unwind:{
path:'$course',
preserveNullAndEmptyArrays: true,
}
},{
$match:{courseName:'高等數(shù)學(xué)',teacher:'李四'}
},{
$project:{
course:1
}
}
])
這樣應(yīng)該會(huì)得到
course:{
_id: 5b7a97508e00501ceaf66032,
teacher: '李四',
courseName: '高等數(shù)學(xué)'
}
如果只是想修改值,那就不需要取出來(lái),直接修改就可以了
student.update(
{stunum:'1'},
{
$set:{'course.$[element].teacher':'張三'}
},
{arrayFilters:[{'element.teacher':'李四'}]}
)
xdebug調(diào)一下,單部觀(guān)察
//文章的 評(píng)論的改一下表就好了
select tb_user.* from tb_article join tb_user on tb_user.id=tb_article.id order by tb_article.create_time desc limit 5;
//一起?效率...就沒(méi)怎么考慮233.....
SELECT
a.uid,
username
FROM
(
(
SELECT
`uid`,
`create_time` AS `time`
FROM
tb_article
)
UNION ALL
(
SELECT
`uid`,
`create_time` AS time
FROM
tb_comment
)
) AS a
JOIN tb_userAS b ON a.uid = b.uid
GROUP BY
a.uid
ORDER BY
a.time DESC
LIMIT 5
1、注意看數(shù)字8的表頭key_len,說(shuō)的是使用索引字段的長(zhǎng)度。
2、Using tempory, Using filesort是受order by語(yǔ)句的影響,你可以去掉order by再看一下執(zhí)行計(jì)劃。
3、eo表使用覆蓋索引是合理的,因?yàn)樗饕呀?jīng)包含了查詢(xún)所需的所有數(shù)據(jù)。
所以是查詢(xún)的sql語(yǔ)句有問(wèn)題了,你這應(yīng)該分成兩個(gè)查詢(xún):一個(gè)查詢(xún)最外面的那個(gè)while的數(shù)據(jù),一個(gè)查詢(xún)藍(lán)色圖片的while的數(shù)據(jù)
查詢(xún)最外層的數(shù)據(jù)是一個(gè)List,然后在里面一個(gè)字段存圖片的List信息
-- 不懂PHP ,但是意思相通
寫(xiě)上端口!命令行默認(rèn)3306,sequel pro并不會(huì)給你默認(rèn)
1,本地能ping到這臺(tái)主機(jī)嗎?
2,本地能telnet通這臺(tái)主機(jī)的3306端口嗎?
3,把bind-address = 127.0.0.1換成bind-address = 0.0.0.0試試呢?
分層設(shè)計(jì)
路由和模型之間加一層控制器來(lái)處理業(yè)務(wù)邏輯
//以文章為例,文章控制器
'use strict';
import ArticleModel from '../../models/article';
class Article {
constructor() {
//...
}
async getArticleById(req, res, next) {
//查找
let article = await ArticleModel.findOne(...);
}
async addArticle(req, res, next) {
//新增
}
// 更新文章需要更新文章評(píng)論數(shù)
// 刪除文章
async deleteArticle(req, res, next) {
//刪除
}
// 更新文章
async updateArticle(req, res, next) {
// 更新
//這里可以先查找在更新,多次調(diào)用
}
}
export default new Article();
//文章路由
'use strict';
import express from 'express';
import Article from '../controllers/blog/article';
const router = express.Router();
router.get('/article/:id', Article.getArticleById);
router.post('/article/add', Article.addArticle);
router.post('/article/update', Article.updateArticle);
router.post('/article/delete', Article.deleteArticle);
export default router
我之前看到的一個(gè)koa+mysql寫(xiě)的也可以參考下,原理類(lèi)似
koa-blog
用moment.js 處理一下
我這個(gè)是可以的。flask-sqlachemy遷移只能添加字段,不能修改和刪除的??聪履愕膍odels.py中表和數(shù)據(jù)庫(kù)表是否一致。
首先,你要確定是你用的MySQL客戶(hù)端截?cái)嗟?,還是MySQL返回時(shí)就截?cái)嗟??測(cè)試方法很簡(jiǎn)單:
SELECT LENGTH(GROUP_CONCAT(id)) ...
如果是后者,可以考慮在配置(my.cnf或my.ini)中把group_concat_max_len
設(shè)得大些,或者每次連接時(shí)執(zhí)行SET SESSION group_concat_max_len = 1000000
。
websocket
或http
輪詢(xún),舊的瀏覽器不支持websocket
不妨 brew install mongodb, 簡(jiǎn)單省事,哈哈哈
或者裝個(gè) docker,docker pull mongodb ,不爽就刪了換個(gè)鏡像,簡(jiǎn)單省心
然后把 對(duì)應(yīng)端口(默認(rèn)27017吧)expose 出來(lái),用對(duì)應(yīng)語(yǔ)言的驅(qū)動(dòng)就可以使用了。
直接用的話(huà),命令行 mongod, 再起一個(gè)界面運(yùn)行 mongo 就可以使用了 db.getCollection('xxx').find({}) 等等,自己上網(wǎng)找找就有了
事務(wù)會(huì)話(huà)期間能不能看到改動(dòng)和事務(wù)的隔離級(jí)別有關(guān).
參見(jiàn)官方文檔:
https://dev.mysql.com/doc/ref...
默認(rèn)情況下是REPEATABLE READ, 可重復(fù)讀,即在事務(wù)期間的多次讀取返回同樣的結(jié)果.
BTW:
mysql定義的四種隔離級(jí)別沒(méi)有 repetable commit
這個(gè).
官網(wǎng)上只有
level:
REPEATABLE READ
READ COMMITTED
READ UNCOMMITTED
SERIALIZABLE
SELECT i.* FROM c_item i, c_item_attr ia WHERE i.item_id = ia.item_id AND ia.attr_id IN (4, 7, 14) GROUP BY i.item_id having count(i.item_id)>2
北大青鳥(niǎo)APTECH成立于1999年。依托北京大學(xué)優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國(guó)IT技能型緊缺人才,是大數(shù)據(jù)專(zhuān)業(yè)的國(guó)家
北大青鳥(niǎo)中博軟件學(xué)院創(chuàng)立于2003年,作為華東區(qū)著名互聯(lián)網(wǎng)學(xué)院和江蘇省首批服務(wù)外包人才培訓(xùn)基地,中博成功培育了近30000名軟件工程師走向高薪崗位,合作企業(yè)超4
中公教育集團(tuán)創(chuàng)建于1999年,經(jīng)過(guò)二十年潛心發(fā)展,已由一家北大畢業(yè)生自主創(chuàng)業(yè)的信息技術(shù)與教育服務(wù)機(jī)構(gòu),發(fā)展為教育服務(wù)業(yè)的綜合性企業(yè)集團(tuán),成為集合面授教學(xué)培訓(xùn)、網(wǎng)
達(dá)內(nèi)教育集團(tuán)成立于2002年,是一家由留學(xué)海歸創(chuàng)辦的高端職業(yè)教育培訓(xùn)機(jī)構(gòu),是中國(guó)一站式人才培養(yǎng)平臺(tái)、一站式人才輸送平臺(tái)。2014年4月3日在美國(guó)成功上市,融資1
曾工作于聯(lián)想擔(dān)任系統(tǒng)開(kāi)發(fā)工程師,曾在博彥科技股份有限公司擔(dān)任項(xiàng)目經(jīng)理從事移動(dòng)互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍(lán)懿科技有限責(zé)任公司從事總經(jīng)理職務(wù)負(fù)責(zé)iOS教學(xué)及管理工作。
浪潮集團(tuán)項(xiàng)目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺(tái)面向?qū)ο箝_(kāi)發(fā)經(jīng)驗(yàn),技術(shù)功底深厚。 授課風(fēng)格 授課風(fēng)格清新自然、條理清晰、主次分明、重點(diǎn)難點(diǎn)突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫(kù),具有快速界面開(kāi)發(fā)的能力,對(duì)瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁(yè)制作和網(wǎng)頁(yè)游戲開(kāi)發(fā)。
具有10 年的Java 企業(yè)應(yīng)用開(kāi)發(fā)經(jīng)驗(yàn)。曾經(jīng)歷任德國(guó)Software AG 技術(shù)顧問(wèn),美國(guó)Dachieve 系統(tǒng)架構(gòu)師,美國(guó)AngelEngineers Inc. 系統(tǒng)架構(gòu)師。