ä½¿ç¨æ¬ç¤ºä¾ééè¿docker容å¨ï¼è¯·å 䏿jxTMSçdockeréåå¹¶æè¯´æå¯å¨tms容å¨ï¼å¹¶ä»helloWorldå¼å§å°è¯ã
jxTMSçæ°æ®åºæä½
对äºç¼ç¨æ¥è¯´ï¼æ°æ®åºæä½å æ¬ï¼
- æ°æ®è¡¨çå®ä¹
- ORMãå¯¹è±¡å ³ç³»æ å°ãæä½ï¼å³é常çå¢å æ¹æ¥
- æ¡ä»¶æ¥è¯¢
ä¸é¢æä»¬æ¥æ¼ç¤ºjxTMSæ¯å¦ä½æä½åä¸¤é¡¹ï¼æ¡ä»¶æ¥è¯¢è¯·åèä¸ä¸èã
æ°æ®è¡¨çå®ä¹
jxTMS䏿¯éè¿å¨åè½æ¨¡åç®å½ä¸çdataæä»¶ä¸å®ä¹ä¸ä¸ªæ°æ®ç±»æ¥å®ç°æ°æ®è¡¨çå®ä¹çã大家å¯ä»¥å¨demo1ç®å½ä¸å建dataæä»¶ï¼ç¶åè¾å ¥ï¼
class demoData:
#jxTMSçæ°æ®å¯¹è±¡å¿
é¡»æä¸»é®æè½ä¿åï¼ä¸è¬å»ºè®®ä½¿ç¨longåçIDä½ä¸ºä¸»é®ï¼å¦åå¯è½ä¼åºç°åç§æå¤
field ID long primaryKey
field CreateTime datetime
field Type string len=32 index 2
field Name string len=126 fulltext
field NoUsed bool
;
ç¶åå°è¯¥æä»¶æç¨sftp管çjxTMSçä»£ç æè¿°æ·è´å°tms容å¨ç/home/tms/codeDefine/demo/demo/demo1ç®å½ä¸ã
æ¤æ¶å¯ä»¥æ¥çæ°æ®åºï¼ççæ¯å¦æäºå为demoDataçæ°æ®è¡¨ï¼
#åæ¢ç®æ æ°æ®åºä¸ºç»ç»çç§ææ°æ®åºï¼demo_6288
mysql> use demo_6288;
#æ¥çæ°æ®è¡¨demoDataçæè¿°
mysql> desc demoData;
ç¶åæ§è¡ä¸æ¬¡çæºå·æ°ã
忬¡æ¥çæ°æ®åºï¼ççæ¯å¦æäºå为demoDataçæ°æ®è¡¨ï¼
#忬¡æ¥çæ°æ®è¡¨demoDataçæè¿°
mysql> desc demoData;
+------------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------+--------------+------+-----+---------+-------+
| ID | bigint(20) | NO | PRI | NULL | |
| NoUsed | tinyint(4) | NO | | NULL | |
| Type | varchar(32) | NO | MUL | NULL | |
| CreateTime | datetime | NO | | NULL | |
| Name | varchar(126) | NO | MUL | NULL | |
+------------+--------------+------+-----+---------+-------+
5 rows in set (0.00 sec)
å¯ä»¥çå°ï¼demoç»ç»æå¯¹åºçæ°æ®åºä¸èªå¨å¤åºäºä¸å¼ demoDataçæ°æ®è¡¨ï¼èä¸è¯¥æ°æ®ä¸çååæä»¬å¨dataæä»¶ä¸çå®ä¹ä¸ä¸å¯¹åºãç¶åæä»¬åçä¸ä¸demoDataç建表è¯å¥ï¼
mysql> show create table demoData;
| demoData | CREATE TABLE `demoData` (
`ID` bigint(20) NOT NULL,
`NoUsed` tinyint(4) NOT NULL,
`Type` varchar(32) NOT NULL,
`CreateTime` datetime NOT NULL,
`Name` varchar(126) NOT NULL,
PRIMARY KEY (`ID`),
KEY `index_demoData_2` (`Type`),
FULLTEXT KEY `index_demoData_F0` (`Name`) /*!50100 WITH PARSER `ngram` */
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci |
æä»¬è¿ä¸æ¥çå°ï¼demoData表ä¸IDæ¯ä¸»é®ï¼èå¨class demoDataçå®ä¹ä¸ï¼
#ID屿§æä¸ä¸ªprimaryKeyçå®ä¹
field ID long primaryKey
以Type建ç«äºä¸ä¸ªç´¢å¼ï¼èå¨class demoDataçå®ä¹ä¸ï¼
#Type屿§æä¸ä¸ª2å·ç´¢å¼ï¼è¯·æ³¨æä¸ä¸æ°æ®åºè¡¨ç¸å
³ç´¢å¼çååæ°æ°æ¯ï¼index_demoData_2
field Type string len=32 index 2
è¿ä»¥Name建ç«äºä¸ä¸ªå ¨æç´¢å¼ï¼èå¨class demoDataçå®ä¹ä¸ï¼
#Name屿§æä¸ä¸ªå
¨æç´¢å¼
field Name string len=126 fulltext
注1ï¼å ¨æç´¢å¼æå°åè¯å使¯ä¸¤ä¸ªåç¬¦ãæ¯æä¸æãï¼æä»¥å¨ä½¿ç¨å ¨æç´¢å¼æ¶ä¸è½åªéå ¥ä¸ä¸ªå符ï¼å¿ 须大äºçäºä¸¤ä¸ªå符
注2ï¼ç±äºmysqlçéå¶ï¼ä¸ä¸ªæ¥è¯¢è¯å¥ä¸åªè½ä½¿ç¨ä¸ä¸ªå ¨æç´¢å¼ï¼å¦ææä¸¤ä¸ªä»¥ä¸çå ¨æç´¢å¼ä¼ä»ä¹ä¹æ¥ä¸å°
å¤§å®¶å¯¹ç §ä¸ä¸dataæä»¶ä¸demoDataç±»çå®ä¹åshow create table demoDataå½ä»¤çè¾åºï¼å°±å¾å®¹æçè§£å¦ä½ç¨dataæä»¶å®ä¹ä¸ä¸ªæ°æ®è¡¨äºãå ·ä½ç说æï¼è¯·åèèªå®ä¹æ°æ®ç±».ã
ORMæä½
æä»¬ç°å¨éè¿dataæä»¶å®ä¹äºdemoDataæ°æ®ç±»ï¼jxTMSè¿èªå¨ä¸ºæä»¬å建好äºdemoDataæ°æ®è¡¨ï¼é£æä»¬å°±è¯ä¸ä¸å¦ä½æä½å®ä»¬å§ã
注ï¼ä»æ¬èå¼å§ï¼ææå¯¹capa.pyçä¿®æ¹ï¼é½æ¯å¨demo1ç±»çå®ä¹ä¸å¢å æä¿®æ¹å ¶ä¸çæä¸ä¸ªå¯¹è±¡å½æ°ï¼å¤§å®¶ä¸å®è¦æ³¨æè¿äºå½æ°ç缩è¿ï¼å¡å¿ 使å¾å ¶ä¸å®è¦æ¯demo1çå¯¹è±¡å½æ°
æä»¬ä¿®æ¹capa.pyä¸çsayHello彿°ï¼å建ä¸ä¸ªæ°çdemoData对象ã对åºdemoData表ä¸çä¸è¡ãï¼
@myModule.event('cmd', 'sayHello')
def sayHello(self, db, ctx):
dd = pyORM.create(db,'demoData')
dd.Type = 'demo'
dd.Name = 'Hello world!'
ç¶åæ§è¡ä¸æ¬¡çæºå·æ°ã
ç¶åç¹å»å¿«æ·æ ä¸çãæ¼ç¤º->helloWorldãï¼ç¹å»ãç¹æãæé®ãç¶åççdemoData表ï¼
mysql> select * from demoData;
+-----------------+--------+------+---------------------+--------------+
| ID | NoUsed | Type | CreateTime | Name |
+-----------------+--------+------+---------------------+--------------+
| 103897269075998 | 0 | demo | 2021-06-11 07:00:30 | Hello world! |
+-----------------+--------+------+---------------------+--------------+
1 row in set (0.00 sec)
注ï¼IDåCreateTimeä¸ä¼åæ¼ç¤ºä¸ç䏿 ·
ä¼åç°ç¡®å®æå ¥äºä¸è¡æ°æ®ï¼å ¶ä¸çTypeåNameä¹ç¡®å®æ¯æä»¬å¨sayHello䏿æå®çï¼ä½IDåCreateTimeæä»¬å¹¶æ²¡ææå®åï¼è¿æ¯ç±äºjxTMSä¼é»è®¤å¦æä¸ä¸ªæ°æ®ç±»å®ä¹äºIDåCreateTimeä¼èªå¨å¸®æä»¬åå§åãå ¶ä¸çIDä¼èµäºä¸ä¸ªå¯ä¸å¼ï¼èCreateTimeåèµäºcreate彿°è°ç¨æ¶çæ¶é´å¼ã
注ï¼IDççæä¾é 主æºå·ä¸æ¶é´ï¼æ¯æ255个主æºãæ¯1024毫ç§å¯äº§ç16M个å¯ä¸çID
ææå¨dataæä»¶ä¸å®ä¹çæ°æ®ç±»ï¼é½æ¯pyORMç±»ï¼ç¶åjxTMSæ ¹æ®dataæä»¶ä¸çå®ä¹ï¼å°ä¹èæä¸ºdemoDataçï¼ä½å¯¹å¼åè æ¥è¯´ï¼ä¸éè¦å ³å¿è¿ä¸ç¹ï¼åªè¦ç»create彿°æå®å®ä¹è¿çæ°æ®ç±»çç±»åï¼jxTMSå°±ä¼èªå¨å建ä¸ä¸ªèæçæ°æ®ç±»ï¼ç¶åç´æ¥å¯¹å ¶å±æ§è¿è¡èµå¼ï¼jxTMSå°±ä¼å°è¿äºå¼ç¿»è¯ä¸ºå¯¹åºçæ°æ®åºç±»åå¹¶ä¿åå°æ°æ®åºä¸ã
è®°ä½ä½ 仿°æ®åºä¸æ¥åºæ¥çdataDataçIDå¼ãææ¥åºæ¥çæ¯ï¼103897269075998ï¼ä½ è¦æ¢æä½ çãï¼ç¶åæä»¬å次修æ¹capa.pyï¼å¢å ä¸ä¸ªhelloWorldçé¢çprepareDispååºå½æ°ï¼
#helloWorldç颿¾ç¤ºåï¼ä¸ºå
¶æ§è¡çé¢åå§å
@myModule.event('prepareDisp', 'helloWorld')
def helloWorld(self, db, ctx):
#读åååå»ºçæ°æ®å¯¹è±¡
#请å°103897269075998æ¿æ¢ä¸ºä½ 仿°æ®åºä¸æ¥è¯¢å°çIDå¼
dd = pyORM.getByID(db.get,'demoData',103897269075998)
#åç»å®äºoutTextçæ§ä»¶åä¿¡æ¯
self.setOutput('outText',utils.getMsg('{}.{}/from:{}',dd.Type,dd.Name,dd.ID)
ç¶åæ§è¡ä¸æ¬¡çæºå·æ°åï¼å次ç¹å»å¿«æ·æ ä¸çãæ¼ç¤º->helloWorldãï¼ççåå䏿¬¡æä½ä¸åï¼
jxTMSéè¿getByID彿°å¯ä»¥ç´æ¥ä»æ°æ®åºä¸è¯»åç¸åºçæ°æ®è¡ï¼ç¶åå建ä¸ä¸ªèæçdemoData对象ï¼å¹¶ç¨è¯»å°çæ°æ®ä¸ºè¯¥å¯¹è±¡çåå屿§èµå¼ãç¶åå°±å¯ä»¥ç´æ¥ä½¿ç¨è¯¥å¯¹è±¡çåä¸ªå±æ§å¼äºã
ç°å¨ï¼æä»¬ç»§ç»ä¿®æ¹sayHello彿°ï¼
@myModule.event('cmd', 'sayHello')
def sayHello(self, db, ctx):
#请å°103897269075998æ¿æ¢ä¸ºä½ 仿°æ®åºä¸æ¥è¯¢å°çIDå¼
dd = pyORM.getByID(db.getDBConn(),'demoData',103897269075998)
dd.Type = 'test'
dd.Name = 'ok'
db.update(dd,'Type','Name')
ç¶åæ§è¡ä¸æ¬¡çæºå·æ°ã
忬¡ç¹å»å¿«æ·æ ä¸çãæ¼ç¤º->helloWorldãï¼ç¹å»ãç¹æãæé®ãç¶å忬¡æ¥çæ°æ®åºä¸çdemoData表ï¼
mysql> select * from demoData;
ççåä¸ä¸ä¸ªselectæä»ä¹ååã
å¼åè å¨è¯»å°æ°æ®å¯¹è±¡åï¼å¯ä»¥ä¿®æ¹é¤IDè¿ä¸ªä¸»é®ä¹å¤çä»»ä½å±æ§ï¼åªè¦å¨ä¿®æ¹åæ§è¡ï¼
db.update(æ°æ®å¯¹è±¡åé,'被修æ¹ç屿§å1','被修æ¹ç屿§å2',......)
jxTMSå³ä¼èªå¨å°ä¿®æ¹æäº¤å°æ°æ®åºä¸ã
注1ï¼ææè¢«ä¿®æ¹ç屿§ï¼å¿ é¡»å¨update彿°ä¸éä¸å举ï¼å¦åjxTMSä¸ä¼æäº¤è¯¥å±æ§çåå
注2ï¼ä¸ç®¡æ¯cmdãè¿æ¯prepareDisp彿°ï¼å¨æ´ä¸ªå½æ°çæ§è¡è¿ç¨ä¸ï¼ææå¯¹æ°æ®åºçåå¨ï¼å æ¬createãupdateï¼é½è¢«çº³å ¥å°åä¸ä¸ªæ°æ®åºäºå¡ä¸ï¼å¨å½æ°æ§è¡è¿ç¨ä¸ä¸ç®¡å 为任ä½åå 导è´çå¼å¸¸ï¼é½ä¼å¯¼è´è¯¥æ°æ®åºäºå¡çåæ»ï¼ä¸ä¼å¯¹æ°æ®åºäº§çå®è´¨çå½±å
注3ï¼ç±äºå¼å¸¸ä¼å¯¼è´æ°æ®åºæä½çåæ»ï¼ècmdãprepareDisp彿°é½æ¯åè½æ¨¡åä¸çå¯¹è±¡å½æ°ï¼æä»¥å¦æå¼åè å°æ°æ®å¯¹è±¡è®¾ç½®ä¸ºäºpython对象çå¯¹è±¡å±æ§ï¼åå¨å¼å¸¸æ¶ä¼å¯¼è´ç¼å䏿¥çæ°æ®å¯¹è±¡åæ°æ®åºä¸çæ°æ®ä¸ä¸è´ï¼å¦ï¼
@myModule.event('cmd', 'sayHello')
def sayHello(self, db, ctx):
#请å°103897269075998æ¿æ¢ä¸ºä½ 仿°æ®åºä¸æ¥è¯¢å°çIDå¼
self.cachedORM = pyORM.getByID(db.getDBConn(),'demoData',103897269075998)
self.cachedORM.Type = 'updated 123'
self.cachedORM.Name = 1 / 0
db.update(self.cachedORM,'Type','Name')
åç±äºã1/0ã伿·åºé¤é¶å¼å¸¸ï¼è¿æ¶ç¨æ·ç¹å»äºåä¸çé¢ä¸çå ¶å®cmdæé®æ¶æ§è¡çååºå½æ°ä¸ï¼å°±ä¼åºç°self.cachedORM.Typeåæ°æ®åºä¸çå¼ä¸ä¸è´çé误ã
æ³¨ï¼æ¯æ¬¡éè¿ç¹å»ãæ¼ç¤º->helloWorldãæå¼çæ ç¾é¡µï¼é½æ¯å¯¹åºäºä¸ä¸ªåç¬çåè½å¯¹è±¡ãè°ç¨New彿°æ°åå»ºåºæ¥çåè½å¯¹è±¡ãï¼æä»¥ä¸¤ä¸ªåæ¶æå¼çhelloWorldå®å ¨ç¬ç«
æä»¥å¢ï¼å¯¹äºè¿ç»çä¸å¡æä½ï¼ä½¿ç¨å¯¹è±¡åéä½ä¸ºä¸å¡æ°æ®çç¼åï¼å½ç¶ä¼æ¾èéä½ç¨getByIDè¯»åæ°æ®åºçæä½ï¼ä½å¾å¯è½ä¼è¯±åæ°æ®ä¸ä¸è´ç严éé误ï¼è妿è¦åè§£è¿ä¸é误ï¼è¿å¿ é¡»æè·å¼å¸¸ç¶åè¿è¡æ¢å¤ï¼æ¢å¤§å¤§å¢å äºå·¥ä½éï¼ä¹æªå¿ è½ç¾åç¾çä¿è¯æ¢å¤çæ£ç¡®æ§ãæä»¥ç¬è 强ç建议ï¼ä¸è¦ç¨å¯¹è±¡åéè·¨æä½ä½ä¸ºä¸å¡æ°æ®çç¼åï¼éè¦çæ¶åç´æ¥ä»æ°æ®åºä¸è¯»å就好äºã
éè¿å ¶å®å±æ§æ¥è¯»åæ°æ®å¯¹è±¡
ä¸é¢æä»¬é½æ¯éè¿getByID彿°æ¥è¯»åæ°æ®å¯¹è±¡çï¼é¤æ¤ä¹å¤ï¼æä»¬è¿å¯ä»¥éè¿å ¶å®å±æ§æ¥è¯»åæ°æ®å¯¹è±¡ï¼
dd = pyORM.get(db.getDBConn(),'æ°æ®ç±»å','屿§å','屿§å¼')
使¯ï¼è¯·å¡å¿ ç¢è®°ï¼ä»¥è¿ç§æ¹å¼è¯»åçè¯¥æ°æ®ç±»çè¯¥å±æ§ï¼å¿ é¡»å ·æå¯ä¸å¼ã妿µæ°´å·ãå¦å·ãå·¥å·çãï¼å¦å读å°çæ°æ®å¾å¯è½æ¯éæºéæ©çä¸ä¸ªã
妿éè¦éè¿å¤ä¸ªå±æ§æ¥è¯»åï¼æè¯»åå¤ä¸ªï¼åå¿ é¡»éç¨æ¡ä»¶æ¥è¯¢çæ¹æ³è¿è¡è¯»åï¼è¯·åèä¸ä¸èä¸ç说æã
å ³äºå é¤ç说æ
ç±äºjxTMS设计çç®çä¹ä¸å°±æ¯å°½å¯è½çéä½å¼åè ç鍿§ï¼æä»¥å¼åè çç»éªæªå¿ è¶³å¤ãé£ä¹è¯¯å é¤å°±ä¼æä¸ºä¸ä¸ªé常ææçéèç¸å¼¹ï¼æä»¥jxTMSé常干èçåæ¶äºææORMæ°æ®å¯¹è±¡çå é¤è½åã
请ç¢è®°ï¼ææORMæ°æ®å¯¹è±¡é½æ æ³å é¤ï¼é¤äºjxTMSå¹³å°å é¨çä¸¤ä¸ªç¹æ®çORMæ°æ®ç±»ï¼
- Relationï¼ç¨äºå»ç»ä¸¤ä¸ªORM对象ä¹é´çå ³ç³»çæ°æ®ç±»
- tagï¼ç¨äºå¯¹æORMæ°æ®å¯¹è±¡è¿è¡æ è®°çæ°æ®ç±»
ä¹å°±æ¯è¯´ï¼åªæè¿ä¸¤ä¸ªç±»æä¾äºå é¤è½åï¼å ¶å®ææçjxTMSçORMæ°æ®ç±»ï¼å æ¬jxTMSå é¨ç¨javaå®ä¹ç以åç¨æ·å¨dataæä»¶ä¸å®ä¹çï¼é½æ¯ä¸ç»åå»ºå°±æ æ³å é¤ã
é£ä¹ï¼å¦æç¡®å®éè¦å é¤ææ°æ®å¯¹è±¡æä¹åå¢ï¼å°±å¦ådemoDataææ¼ç¤ºçï¼å®ä¹ä¸ä¸ªNoUsedçå¸å°å±æ§ï¼å½éè¦å 餿¶ï¼å°è¯¥å±æ§è®¾ç½®ä¸ºTrueï¼ç¶å卿¥è¯¢æ¶è¿æ»¤æææNoUsed=trueçæ°æ®è¡å³å¯ã