sqlx: use github.com/alimy/yesql parse SQL files with multiple named queries and automatically prepare and scan them into structs

r/paopao-ce-xtra
Michael Li 3 years ago
parent c5866c0f74
commit f890e647d3
No known key found for this signature in database

@ -7,6 +7,7 @@ require (
github.com/afocus/captcha v0.0.0-20191010092841-4bd1f21c8868
github.com/alimy/cfg v0.3.0
github.com/alimy/mir/v3 v3.1.1
github.com/alimy/yesql v0.2.0
github.com/aliyun/aliyun-oss-go-sdk v2.2.6+incompatible
github.com/allegro/bigcache/v3 v3.0.2
github.com/bytedance/sonic v1.8.5
@ -20,7 +21,7 @@ require (
github.com/golang-jwt/jwt/v4 v4.5.0
github.com/golang-migrate/migrate/v4 v4.15.2
github.com/huaweicloud/huaweicloud-sdk-go-obs v3.23.3+incompatible
github.com/jmoiron/sqlx v1.3.1
github.com/jmoiron/sqlx v1.3.5
github.com/json-iterator/go v1.1.12
github.com/meilisearch/meilisearch-go v0.21.0
github.com/minio/minio-go/v7 v7.0.49

@ -127,6 +127,8 @@ github.com/alimy/cfg v0.3.0 h1:9xgA0QWVCPSq9fFNRcYahVCAX22IL9ts2wrTQPfAStY=
github.com/alimy/cfg v0.3.0/go.mod h1:rOxbasTH2srl6StAjNF5Vyi8bfrdkl3fLGmOYtSw81c=
github.com/alimy/mir/v3 v3.1.1 h1:3tz7uGOwuA1IKU0BysyBvGbyqKtEVMuhPBD/APk1ANw=
github.com/alimy/mir/v3 v3.1.1/go.mod h1:ybhT2ijOiDn0lLwWzIY6vXdv+uzZrctS7VFfczcXBWU=
github.com/alimy/yesql v0.2.0 h1:tYDPxWSakSUOss1xcYisRjDH//GnUunvlrfB4Ek8ikQ=
github.com/alimy/yesql v0.2.0/go.mod h1:Y0FdRIwIbJyTv56wSX+MpaIHiAW1PyKTDYO6K/er4JY=
github.com/aliyun/aliyun-oss-go-sdk v2.2.6+incompatible h1:KXeJoM1wo9I/6xPTyt6qCxoSZnmASiAjlrr0dyTUKt8=
github.com/aliyun/aliyun-oss-go-sdk v2.2.6+incompatible/go.mod h1:T/Aws4fEfogEE9v+HPhhw+CntffsBHJ8nXQCwKr0/g8=
github.com/allegro/bigcache/v3 v3.0.2 h1:AKZCw+5eAaVyNTBmI2fgyPVJhHkdWder3O9IrprcQfI=
@ -795,8 +797,9 @@ github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht
github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo=
github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U=
github.com/jmoiron/sqlx v1.2.0/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhBSsks=
github.com/jmoiron/sqlx v1.3.1 h1:aLN7YINNZ7cYOPK3QC83dbM6KT0NMqVMw961TqrejlE=
github.com/jmoiron/sqlx v1.3.1/go.mod h1:2BljVx/86SuTyjE+aPYlHCTNvZrnJXghYGpNiXLBMCQ=
github.com/jmoiron/sqlx v1.3.5 h1:vFFPA71p1o5gAeqtEAwLU4dnX2napprKtHr7PYIcN3g=
github.com/jmoiron/sqlx v1.3.5/go.mod h1:nRVWtLre0KfCLJvgxzCsLVMogSvQ1zNJtpYr2Ccp0mQ=
github.com/joefitzgerald/rainbow-reporter v0.1.0/go.mod h1:481CNgqmVHQZzdIbN52CupLJyoVwB10FQ/IQlF1pdL8=
github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg=
github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=

@ -53,7 +53,7 @@ func (s *authorizationManageSrv) isFriend(userId int64, friendId int64) bool {
func newAuthorizationManageService(db *sqlx.DB) core.AuthorizationManageService {
return &authorizationManageSrv{
sqlxSrv: newSqlxSrv(db),
stmtIdx: c(`SELECT * FROM @person WHERE first_name=?`),
stmtUpdateFriend: c(`SELECT * FROM @person WHERE first_name=?`),
stmtIdx: c(`SELECT * FROM @user WHERE username=?`),
stmtUpdateFriend: c(`SELECT * FROM @user WHERE username=?`),
}
}

@ -96,15 +96,15 @@ func (s *commentManageSrv) CreateCommentContent(content *core.CommentContent) (*
func newCommentService(db *sqlx.DB) core.CommentService {
return &commentSrv{
sqlxSrv: newSqlxSrv(db),
stmtGetComments: c(`SELECT * FROM @person WHERE first_name=?`),
stmtGetReply: c(`SELECT * FROM @person WHERE first_name=?`),
stmtGetComments: c(`SELECT * FROM @user WHERE username=?`),
stmtGetReply: c(`SELECT * FROM @user WHERE username=?`),
}
}
func newCommentManageService(db *sqlx.DB) core.CommentManageService {
return &commentManageSrv{
sqlxSrv: newSqlxSrv(db),
stmtAddComents: c(`SELECT * FROM @person WHERE first_name=?`),
stmtDelComments: c(`SELECT * FROM @person WHERE first_name=?`),
stmtAddComents: c(`SELECT * FROM @user WHERE username=?`),
stmtDelComments: c(`SELECT * FROM @user WHERE username=?`),
}
}

@ -59,7 +59,7 @@ func (s *contactManageSrv) IsFriend(userId int64, friendId int64) bool {
func newContactManageService(db *sqlx.DB) core.ContactManageService {
return &contactManageSrv{
sqlxSrv: newSqlxSrv(db),
stmtAddFriend: c(`SELECT * FROM @person WHERE first_name=?`),
stmtDelFriend: c(`SELECT * FROM @person WHERE first_name=?`),
stmtAddFriend: c(`SELECT * FROM @user WHERE username=?`),
stmtDelFriend: c(`SELECT * FROM @user WHERE username=?`),
}
}

@ -60,8 +60,8 @@ func (s *messageSrv) GetMessageCount(conditions *core.ConditionsT) (int64, error
func newMessageService(db *sqlx.DB) core.MessageService {
return &messageSrv{
sqlxSrv: newSqlxSrv(db),
stmtAddMsg: c(`SELECT * FROM @person WHERE first_name=?`),
stmtGetMsg: c(`SELECT * FROM @person WHERE first_name=?`),
stmtReadMsg: c(`SELECT * FROM @person WHERE first_name=?`),
stmtAddMsg: c(`SELECT * FROM @user WHERE username=?`),
stmtGetMsg: c(`SELECT * FROM @user WHERE username=?`),
stmtReadMsg: c(`SELECT * FROM @user WHERE username=?`),
}
}

@ -9,6 +9,7 @@ import (
"github.com/Masterminds/semver/v3"
"github.com/alimy/cfg"
"github.com/alimy/yesql"
"github.com/rocboss/paopao-ce/internal/core"
"github.com/rocboss/paopao-ce/internal/dao/cache"
"github.com/rocboss/paopao-ce/internal/dao/security"
@ -19,6 +20,9 @@ var (
_ core.DataService = (*dataSrv)(nil)
_ core.VersionInfo = (*dataSrv)(nil)
_ core.WebDataServantA = (*webDataSrvA)(nil)
_ core.VersionInfo = (*webDataSrvA)(nil)
_onceInitial sync.Once
)
@ -38,6 +42,13 @@ type dataSrv struct {
core.AttachmentCheckService
}
type webDataSrvA struct {
core.TopicServantA
core.TweetServantA
core.TweetManageServantA
core.TweetHelpServantA
}
func NewDataService() (core.DataService, core.VersionInfo) {
lazyInitial()
@ -75,11 +86,12 @@ func NewDataService() (core.DataService, core.VersionInfo) {
}
logrus.Infof("use %s as cache index service by version: %s", v.Name(), v.Version())
query := yesql.MustParseBytes(yesqlBytes)
ds := &dataSrv{
IndexPostsService: cis,
WalletService: newWalletService(_db),
MessageService: newMessageService(_db),
TopicService: newTopicService(_db),
TopicService: newTopicService(_db, query),
TweetService: newTweetService(_db),
TweetManageService: newTweetManageService(_db, cis),
TweetHelpService: newTweetHelpService(_db),
@ -94,8 +106,10 @@ func NewDataService() (core.DataService, core.VersionInfo) {
}
func NewWebDataServantA() (core.WebDataServantA, core.VersionInfo) {
logrus.Fatal("not support now")
return nil, nil
lazyInitial()
// db := conf.MustSqlxDB()
ds := &webDataSrvA{}
return ds, ds
}
func NewAuthorizationManageService() core.AuthorizationManageService {
@ -111,6 +125,14 @@ func (s *dataSrv) Version() *semver.Version {
return semver.MustParse("v0.1.0")
}
func (s *webDataSrvA) Name() string {
return "Sqlx"
}
func (s *webDataSrvA) Version() *semver.Version {
return semver.MustParse("v0.0.0")
}
// lazyInitial do some package lazy initialize for performance
func lazyInitial() {
_onceInitial.Do(func() {

@ -46,7 +46,7 @@ func newSecurityService(db *sqlx.DB, phoneVerify core.PhoneVerifyService) core.S
return &securitySrv{
sqlxSrv: newSqlxSrv(db),
phoneVerify: phoneVerify,
stmtAddCaptcha: c(`SELECT * FROM @person WHERE first_name=?`),
stmtGetCaptcha: c(`SELECT * FROM @person WHERE first_name=?`),
stmtAddCaptcha: c(`SELECT * FROM @user WHERE username=?`),
stmtGetCaptcha: c(`SELECT * FROM @user WHERE username=?`),
}
}

@ -7,13 +7,18 @@ package sakila
import (
"context"
"database/sql"
_ "embed"
"strings"
"github.com/alimy/yesql"
"github.com/jmoiron/sqlx"
"github.com/rocboss/paopao-ce/internal/conf"
"github.com/sirupsen/logrus"
)
//go:embed yesql.sql
var yesqlBytes []byte
var (
_db *sqlx.DB
)
@ -89,7 +94,8 @@ func r(query string) string {
}
func c(query string) *sqlx.Stmt {
stmt, err := _db.Preparex(_db.Rebind(t(query)))
query = _db.Rebind(t(query))
stmt, err := _db.Preparex(query)
if err != nil {
logrus.Fatalf("prepare query(%s) error: %s", query, err)
}
@ -97,7 +103,8 @@ func c(query string) *sqlx.Stmt {
}
func n(query string) *sqlx.NamedStmt {
stmt, err := _db.PrepareNamed(t(query))
query = t(query)
stmt, err := _db.PrepareNamed(query)
if err != nil {
logrus.Fatalf("prepare named query(%s) error: %s", query, err)
}
@ -111,4 +118,16 @@ func t(query string) string {
func initSqlxDB() {
_db = conf.MustSqlxDB()
yesql.UseSqlx(_db)
yesql.SetDefaultQueryHooks(func(query *yesql.Query) (*yesql.Query, error) {
qstr := strings.TrimRight(query.Query, ";")
// table name fixed
qstr = strings.Replace(qstr, "@", conf.DatabaseSetting.TablePrefix, -1)
// rebind query
if clause, exist := query.Tags["clause"]; !exist || clause != "in" {
qstr = _db.Rebind(qstr)
}
query.Query = qstr
return query, nil
})
}

@ -91,7 +91,7 @@ func newFriendIndexService(db *sqlx.DB, ams core.AuthorizationManageService, ths
return &friendIndexSrv{
ams: ams,
sqlxSrv: newSqlxSrv(db),
stmtIndex: c(`SELECT * FROM @person WHERE first_name=?`),
stmtIndex: c(`SELECT * FROM @user WHERE username=?`),
}
}
@ -99,7 +99,7 @@ func newFollowIndexService(db *sqlx.DB, ths core.TweetHelpService) core.IndexPos
return &followIndexSrv{
ths: ths,
sqlxSrv: newSqlxSrv(db),
stmtIndex: c(`SELECT * FROM @person WHERE first_name=?`),
stmtIndex: c(`SELECT * FROM @user WHERE username=?`),
}
}
@ -107,7 +107,7 @@ func newLightIndexService(db *sqlx.DB, ths core.TweetHelpService) core.IndexPost
return &lightIndexSrv{
ths: ths,
sqlxSrv: newSqlxSrv(db),
stmtIndex: c(`SELECT * FROM @person WHERE first_name=?`),
stmtIndex: c(`SELECT * FROM @user WHERE username=?`),
}
}
@ -115,6 +115,6 @@ func newSimpleIndexPostsService(db *sqlx.DB, ths core.TweetHelpService) core.Ind
return &simpleIndexPostsSrv{
ths: ths,
sqlxSrv: newSqlxSrv(db),
stmtIndex: c(`SELECT * FROM @person WHERE first_name=?`),
stmtIndex: c(`SELECT * FROM @user WHERE username=?`),
}
}

@ -8,9 +8,11 @@ import (
"strings"
"time"
"github.com/alimy/yesql"
"github.com/jmoiron/sqlx"
"github.com/rocboss/paopao-ce/internal/core"
"github.com/rocboss/paopao-ce/internal/core/cs"
"github.com/sirupsen/logrus"
)
var (
@ -19,16 +21,17 @@ var (
type topicSrv struct {
*sqlxSrv
stmtNewestTags *sqlx.Stmt
stmtHotTags *sqlx.Stmt
stmtTagsByKeywordA *sqlx.Stmt
stmtTagsByKeywordB *sqlx.Stmt
stmtInsertTag *sqlx.Stmt
sqlTagsByIdA string
sqlTagsByIdB string
sqlDecrTagsById string
sqlTagsForIncr string
sqlIncrTagsById string
Scope yesql.Scope `yesql:"topic"`
StmtNewestTags *sqlx.Stmt `yesql:"newest_tags"`
StmtHotTags *sqlx.Stmt `yesql:"hot_tags"`
StmtTagsByKeywordA *sqlx.Stmt `yesql:"tags_by_keyword_a"`
StmtTagsByKeywordB *sqlx.Stmt `yesql:"tags_by_keyword_b"`
StmtInsertTag *sqlx.Stmt `yesql:"insert_tag"`
SqlTagsByIdA string `yesql:"tags_by_id_a"`
SqlTagsByIdB string `yesql:"tags_by_id_b"`
SqlDecrTagsById string `yesql:"decr_tags_by_id"`
SqlTagsForIncr string `yesql:"tags_for_incr"`
SqlIncrTagsById string `yesql:"incr_tags_by_id"`
}
func (s *topicSrv) UpsertTags(userId int64, tags []string) (res cs.TagInfoList, xerr error) {
@ -37,7 +40,7 @@ func (s *topicSrv) UpsertTags(userId int64, tags []string) (res cs.TagInfoList,
}
xerr = s.with(func(tx *sqlx.Tx) error {
var upTags cs.TagInfoList
if err := s.inSelect(tx, &upTags, s.sqlTagsForIncr, tags); err != nil {
if err := s.inSelect(tx, &upTags, s.SqlTagsForIncr, tags); err != nil {
return err
}
now := time.Now().Unix()
@ -57,7 +60,7 @@ func (s *topicSrv) UpsertTags(userId int64, tags []string) (res cs.TagInfoList,
}
}
}
if _, err := s.inExec(tx, s.sqlIncrTagsById, now, ids); err != nil {
if _, err := s.inExec(tx, s.SqlIncrTagsById, now, ids); err != nil {
return err
}
res = append(res, upTags...)
@ -68,7 +71,7 @@ func (s *topicSrv) UpsertTags(userId int64, tags []string) (res cs.TagInfoList,
}
var ids []int64
for _, tag := range tags {
res, err := s.stmtInsertTag.Exec(userId, tag, now, now)
res, err := s.StmtInsertTag.Exec(userId, tag, now, now)
if err != nil {
return err
}
@ -79,7 +82,7 @@ func (s *topicSrv) UpsertTags(userId int64, tags []string) (res cs.TagInfoList,
ids = append(ids, id)
}
var newTags cs.TagInfoList
if err := s.inSelect(tx, &newTags, s.sqlTagsByIdB, ids); err != nil {
if err := s.inSelect(tx, &newTags, s.SqlTagsByIdB, ids); err != nil {
return err
}
res = append(res, newTags...)
@ -91,11 +94,11 @@ func (s *topicSrv) UpsertTags(userId int64, tags []string) (res cs.TagInfoList,
func (s *topicSrv) DecrTagsById(ids []int64) error {
return s.with(func(tx *sqlx.Tx) error {
var ids []int64
err := s.inSelect(tx, &ids, s.sqlTagsByIdA, ids)
err := s.inSelect(tx, &ids, s.SqlTagsByIdA, ids)
if err != nil {
return err
}
_, err = s.inExec(tx, s.sqlDecrTagsById, time.Now().Unix(), ids)
_, err = s.inExec(tx, s.SqlDecrTagsById, time.Now().Unix(), ids)
return err
})
}
@ -103,9 +106,9 @@ func (s *topicSrv) DecrTagsById(ids []int64) error {
func (s *topicSrv) ListTags(typ cs.TagType, limit int, offset int) (res cs.TagList, err error) {
switch typ {
case cs.TagTypeHot:
err = s.stmtHotTags.Select(&res, limit, offset)
err = s.StmtHotTags.Select(&res, limit, offset)
case cs.TagTypeNew:
err = s.stmtNewestTags.Select(&res, limit, offset)
err = s.StmtNewestTags.Select(&res, limit, offset)
}
return
}
@ -113,25 +116,19 @@ func (s *topicSrv) ListTags(typ cs.TagType, limit int, offset int) (res cs.TagLi
func (s *topicSrv) TagsByKeyword(keyword string) (res cs.TagInfoList, err error) {
keyword = "%" + strings.Trim(keyword, " ") + "%"
if keyword == "%%" {
err = s.stmtTagsByKeywordA.Select(&res)
err = s.StmtTagsByKeywordA.Select(&res)
} else {
err = s.stmtTagsByKeywordB.Select(&res)
err = s.StmtTagsByKeywordB.Select(&res)
}
return
}
func newTopicService(db *sqlx.DB) core.TopicService {
return &topicSrv{
sqlxSrv: newSqlxSrv(db),
stmtNewestTags: c(`SELECT t.id id, t.user_id user_id, t.tag tag, t.quote_num quote_num, u.id, u.nickname, u.username, u.status, u.avatar, u.is_admin FROM @tag t JOIN @user u ON t.user_id = u.id WHERE t.is_del = 0 AND t.quote_num > 0 ORDER BY t.id DESC LIMIT ? OFFSET ?`),
stmtHotTags: c(`SELECT t.id id, t.user_id user_id, t.tag tag, t.quote_num quote_num, u.id, u.nickname, u.username, u.status, u.avatar, u.is_admin FROM @tag t JOIN @user u ON t.user_id = u.id WHERE t.is_del = 0 AND t.quote_num > 0 ORDER BY t.quote_num DESC LIMIT ? OFFSET ?`),
stmtTagsByKeywordA: c(`SELECT id, user_id, tag, quote_num FROM @tag WHERE is_del = 0 ORDER BY quote_num DESC LIMIT 6`),
stmtTagsByKeywordB: c(`SELECT id, user_id, tag, quote_num FROM @tag WHERE is_del = 0 AND tag LIKE ? ORDER BY quote_num DESC LIMIT 6`),
stmtInsertTag: c(`INSERT INTO @tag (user_id, tag, created_on, modified_on, quote_num) VALUES (?, ?, ?, ?, 1)`),
sqlTagsByIdA: t(`SELECT id FROM @tag WHERE id IN (?) AND is_del = 0 AND quote_num > 0`),
sqlTagsByIdB: t(`SELECT id, user_id, tag, quote_num FROM @tag WHERE id IN (?)`),
sqlDecrTagsById: t(`UPDATE @tag SET quote_num=quote_num-1, modified_on=? WHERE id IN (?)`),
sqlTagsForIncr: t(`SELECT id, user_id, tag, quote_num FROM @tag WHERE tag IN (?)`),
sqlIncrTagsById: t(`UPDATE @tag SET quote_num=quote_num+1, is_del=0, modified_on=? WHERE id IN (?)`),
func newTopicService(db *sqlx.DB, query yesql.SQLQuery) core.TopicService {
obj := &topicSrv{
sqlxSrv: newSqlxSrv(db),
}
if err := yesql.Scan(obj, query); err != nil {
logrus.Fatal(err)
}
return obj
}

@ -326,9 +326,9 @@ func (s *tweetSrv) AttachmentByTweetId(userId int64, tweetId int64) (*cs.Attachm
func newTweetService(db *sqlx.DB) core.TweetService {
return &tweetSrv{
sqlxSrv: newSqlxSrv(db),
stmtGetTweet: c(`SELECT * FROM @person WHERE first_name=?`),
stmtListTweet: c(`SELECT * FROM @person WHERE first_name=?`),
stmtListStar: c(`SELECT * FROM @person WHERE first_name=?`),
stmtGetTweet: c(`SELECT * FROM @user WHERE username=?`),
stmtListTweet: c(`SELECT * FROM @user WHERE username=?`),
stmtListStar: c(`SELECT * FROM @user WHERE username=?`),
}
}
@ -336,17 +336,17 @@ func newTweetManageService(db *sqlx.DB, cacheIndex core.CacheIndexService) core.
return &tweetManageSrv{
sqlxSrv: newSqlxSrv(db),
cacheIndex: cacheIndex,
stmtAddTweet: c(`SELECT * FROM @person WHERE first_name=?`),
stmtDelTweet: c(`SELECT * FROM @person WHERE first_name=?`),
stmtStickTweet: c(`SELECT * FROM @person WHERE first_name=?`),
stmtAddTweet: c(`SELECT * FROM @user WHERE username=?`),
stmtDelTweet: c(`SELECT * FROM @user WHERE username=?`),
stmtStickTweet: c(`SELECT * FROM @user WHERE username=?`),
}
}
func newTweetHelpService(db *sqlx.DB) core.TweetHelpService {
return &tweetHelpSrv{
sqlxSrv: newSqlxSrv(db),
stmtAddTag: c(`SELECT * FROM @person WHERE first_name=?`),
stmtDelTag: c(`SELECT * FROM @person WHERE first_name=?`),
stmtListTag: c(`SELECT * FROM @person WHERE first_name=?`),
stmtAddTag: c(`SELECT * FROM @user WHERE username=?`),
stmtDelTag: c(`SELECT * FROM @user WHERE username=?`),
stmtListTag: c(`SELECT * FROM @user WHERE username=?`),
}
}

@ -66,8 +66,8 @@ func (s *userManageSrv) UpdateUser(user *core.User) error {
func newUserManageService(db *sqlx.DB) core.UserManageService {
return &userManageSrv{
sqlxSrv: newSqlxSrv(db),
stmtAddUser: c(`SELECT * FROM @person WHERE first_name=?`),
stmtUpdateUser: c(`SELECT * FROM @person WHERE first_name=?`),
stmtGetUser: c(`SELECT * FROM @person WHERE first_name=?`),
stmtAddUser: c(`SELECT * FROM @user WHERE username=?`),
stmtUpdateUser: c(`SELECT * FROM @user WHERE username=?`),
stmtGetUser: c(`SELECT * FROM @user WHERE username=?`),
}
}

@ -59,8 +59,8 @@ func (s *walletSrv) HandlePostAttachmentBought(post *core.Post, user *core.User)
func newWalletService(db *sqlx.DB) core.WalletService {
return &walletSrv{
sqlxSrv: newSqlxSrv(db),
stmtAddRecharge: c(`SELECT * FROM @person WHERE first_name=?`),
stmtGetRecharge: c(`SELECT * FROM @person WHERE first_name=?`),
stmtGetBills: c(`SELECT * FROM @person WHERE first_name=?`),
stmtAddRecharge: c(`SELECT * FROM @user WHERE username=?`),
stmtGetRecharge: c(`SELECT * FROM @user WHERE username=?`),
stmtGetBills: c(`SELECT * FROM @user WHERE username=?`),
}
}

@ -0,0 +1,50 @@
-- name: newest_tags@topic
-- get newest tag information
SELECT t.id id, t.user_id user_id, t.tag tag, t.quote_num quote_num, u.id, u.nickname, u.username, u.status, u.avatar, u.is_admin
FROM @tag t
JOIN @user u
ON t.user_id = u.id
WHERE t.is_del = 0 AND t.quote_num > 0
ORDER BY t.id DESC
LIMIT ? OFFSET ?;
-- name: hot_tags@topic
-- get get host tag information
SELECT t.id id, t.user_id user_id, t.tag tag, t.quote_num quote_num, u.id, u.nickname, u.username, u.status, u.avatar, u.is_admin
FROM @tag t
JOIN @user u
ON t.user_id = u.id
WHERE t.is_del = 0 AND t.quote_num > 0
ORDER BY t.quote_num DESC
LIMIT ? OFFSET ?;
-- name: tags_by_keyword_a@topic
-- get tags by keyword
SELECT id, user_id, tag, quote_num FROM @tag WHERE is_del = 0 ORDER BY quote_num DESC LIMIT 6;
-- name: tags_by_keyword_b@topic
SELECT id, user_id, tag, quote_num FROM @tag WHERE is_del = 0 AND tag LIKE ? ORDER BY quote_num DESC LIMIT 6;
-- name: insert_tag@topic
INSERT INTO @tag (user_id, tag, created_on, modified_on, quote_num) VALUES (?, ?, ?, ?, 1);
-- name: tags_by_id_a@topic
-- clause: in
SELECT id FROM @tag WHERE id IN (?) AND is_del = 0 AND quote_num > 0;
-- name: tags_by_id_b@topic
-- clause: in
SELECT id, user_id, tag, quote_num FROM @tag WHERE id IN (?);
-- name: decr_tags_by_id@topic
-- clause: in
UPDATE @tag SET quote_num=quote_num-1, modified_on=? WHERE id IN (?);
-- name: tags_for_incr@topic
-- clause: in
SELECT id, user_id, tag, quote_num FROM @tag WHERE tag IN (?);
-- name: incr_tags_by_id@topic
-- clause: in
UPDATE @tag SET quote_num=quote_num+1, is_del=0, modified_on=? WHERE id IN (?);
Loading…
Cancel
Save