From 8b57c6aaf0c5b72e31ec66bc25402559d8766377 Mon Sep 17 00:00:00 2001 From: Feng Chang <13818037+chang196700@users.noreply.github.com> Date: Fri, 14 Apr 2023 11:09:53 +0800 Subject: [PATCH] Add postgresql support (#792) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * use false for bool type Signed-off-by: ChangFeng * use `limit ? offset ?` instead limit ?,? for database compatibility Signed-off-by: ChangFeng * add postgresql support Signed-off-by: ChangFeng * add postgres options and descriptions Signed-off-by: ChangFeng --------- close #791 Signed-off-by: ChangFeng Co-authored-by: 玖亖伍 --- commands/command.go | 25 +++++++++++++++++++++++++ conf/app.conf.example | 8 +++++++- models/BookModel.go | 22 +++++++++++----------- models/BookResult.go | 4 ++-- models/DocumentHistory.go | 4 ++-- models/DocumentSearchResult.go | 8 ++++---- models/Itemsets.go | 8 ++++---- models/MemberResult.go | 4 ++-- models/Team.go | 8 ++++---- 9 files changed, 61 insertions(+), 30 deletions(-) diff --git a/commands/command.go b/commands/command.go index 15654eca..7097b46b 100644 --- a/commands/command.go +++ b/commands/command.go @@ -26,6 +26,7 @@ import ( "github.com/beego/beego/v2/server/web" "github.com/beego/i18n" "github.com/howeyc/fsnotify" + _ "github.com/lib/pq" "github.com/lifei6671/gocaptcha" "github.com/mindoc-org/mindoc/cache" "github.com/mindoc-org/mindoc/conf" @@ -84,6 +85,30 @@ func RegisterDataBase() { if err != nil { logs.Error("注册默认数据库失败->", err) } + } else if strings.EqualFold(dbadapter, "postgres") { + host, _ := web.AppConfig.String("db_host") + database, _ := web.AppConfig.String("db_database") + username, _ := web.AppConfig.String("db_username") + password, _ := web.AppConfig.String("db_password") + sslmode, _ := web.AppConfig.String("db_sslmode") + + timezone, _ := web.AppConfig.String("timezone") + location, err := time.LoadLocation(timezone) + if err == nil { + orm.DefaultTimeLoc = location + } else { + logs.Error("加载时区配置信息失败,请检查是否存在 ZONEINFO 环境变量->", err) + } + + port, _ := web.AppConfig.String("db_port") + + dataSource := fmt.Sprintf("postgres://%s:%s@%s:%s/%s?sslmode=%s", username, password, host, port, database, sslmode) + + if err := orm.RegisterDataBase("default", "postgres", dataSource); err != nil { + logs.Error("注册默认数据库失败->", err) + os.Exit(1) + } + } else { logs.Error("不支持的数据库类型.") os.Exit(1) diff --git a/conf/app.conf.example b/conf/app.conf.example index 012671f1..e617faf6 100644 --- a/conf/app.conf.example +++ b/conf/app.conf.example @@ -53,13 +53,19 @@ timezone = Asia/Shanghai ####################MySQL 数据库配置########################### -#支持MySQL和sqlite3两种数据库,如果是sqlite3 则 db_database 标识数据库的物理目录 +#支持MySQL,sqlite3,postgres三种数据库,如果是sqlite3 则 db_database 标识数据库的物理目录 db_adapter="${MINDOC_DB_ADAPTER||sqlite3}" db_host="${MINDOC_DB_HOST||127.0.0.1}" db_port="${MINDOC_DB_PORT||3306}" db_database="${MINDOC_DB_DATABASE||./database/mindoc.db}" db_username="${MINDOC_DB_USERNAME||root}" db_password="${MINDOC_DB_PASSWORD||123456}" +#是否使用SSL,支持posgres,可选的值有: +#disable - No SSL +#require - Always SSL (skip verification) +#verify-ca - Always SSL (verify that the certificate presented by the server was signed by a trusted CA) +#verify-full - Always SSL (verify that the certification presented by the server was signed by a trusted CA and the server host name matches the one in the certificate) +db_sslmode="${MINDOC_DB_SSLMODE||disable}" ####################sqlite3 数据库配置########################### #db_adapter=sqlite3 diff --git a/models/BookModel.go b/models/BookModel.go index 47d58fd0..d46d2ff5 100644 --- a/models/BookModel.go +++ b/models/BookModel.go @@ -393,7 +393,7 @@ FROM md_books AS book // " LEFT JOIN " + relationship.TableNameWithPrefix() + " AS rel ON book.book_id=rel.book_id AND rel.member_id = ?" + // " LEFT JOIN " + relationship.TableNameWithPrefix() + " AS rel1 ON book.book_id=rel1.book_id AND rel1.role_id=0" + // " LEFT JOIN " + NewMember().TableNameWithPrefix() + " AS m ON rel1.member_id=m.member_id " + - // " WHERE rel.relationship_id > 0 ORDER BY book.order_index DESC,book.book_id DESC LIMIT " + fmt.Sprintf("%d,%d", offset, pageSize) + // " WHERE rel.relationship_id > 0 ORDER BY book.order_index DESC,book.book_id DESC LIMIT " + fmt.Sprintf("%d,%d", pageSize, offset) sql2 := `SELECT book.*, @@ -410,9 +410,9 @@ FROM md_books AS book LEFT JOIN md_relationship AS rel1 ON book.book_id = rel1.book_id AND rel1.role_id = 0 LEFT JOIN md_members AS m ON rel1.member_id = m.member_id WHERE rel.role_id >= 0 or team.role_id >= 0 -ORDER BY book.order_index, book.book_id DESC limit ?,?` +ORDER BY book.order_index, book.book_id DESC limit ? offset ?` - _, err = o.Raw(sql2, memberId, memberId, offset, pageSize).QueryRows(&books) + _, err = o.Raw(sql2, memberId, memberId, pageSize, offset).QueryRows(&books) if err != nil { logs.Error("分页查询项目列表 => ", err) return @@ -550,9 +550,9 @@ WHERE book.privately_owned = 0 or rel.role_id >=0 or team.role_id >=0` as t group by book_id) as team on team.book_id=book.book_id LEFT JOIN md_relationship AS rel1 ON rel1.book_id = book.book_id AND rel1.role_id = 0 LEFT JOIN md_members AS mdmb ON rel1.member_id = mdmb.member_id -WHERE book.privately_owned = 0 or rel.role_id >=0 or team.role_id >=0 ORDER BY order_index desc,book.book_id DESC LIMIT ?,?` +WHERE book.privately_owned = 0 or rel.role_id >=0 or team.role_id >=0 ORDER BY order_index desc,book.book_id DESC limit ? offset ?` - _, err = o.Raw(sql2, memberId, memberId, offset, pageSize).QueryRows(&books) + _, err = o.Raw(sql2, memberId, memberId, pageSize, offset).QueryRows(&books) } else { count, err1 := o.QueryTable(book.TableNameWithPrefix()).Filter("privately_owned", 0).Count() @@ -566,9 +566,9 @@ WHERE book.privately_owned = 0 or rel.role_id >=0 or team.role_id >=0 ORDER BY o sql := `SELECT book.*,rel.*,mdmb.account AS create_name,mdmb.real_name FROM md_books AS book LEFT JOIN md_relationship AS rel ON rel.book_id = book.book_id AND rel.role_id = 0 LEFT JOIN md_members AS mdmb ON rel.member_id = mdmb.member_id - WHERE book.privately_owned = 0 ORDER BY order_index DESC ,book.book_id DESC LIMIT ?,?` + WHERE book.privately_owned = 0 ORDER BY order_index DESC ,book.book_id DESC limit ? offset ?` - _, err = o.Raw(sql, offset, pageSize).QueryRows(&books) + _, err = o.Raw(sql, pageSize, offset).QueryRows(&books) } return @@ -604,9 +604,9 @@ WHERE (relationship_id > 0 OR book.privately_owned = 0 or team.team_member_id > LEFT JOIN md_relationship AS rel1 ON rel1.book_id = book.book_id AND rel1.role_id = 0 LEFT JOIN md_members AS mdmb ON rel1.member_id = mdmb.member_id WHERE (rel.relationship_id > 0 OR book.privately_owned = 0 or team.team_member_id > 0) - AND book.label LIKE ? ORDER BY order_index DESC ,book.book_id DESC LIMIT ?,?` + AND book.label LIKE ? ORDER BY order_index DESC ,book.book_id DESC limit ? offset ?` - _, err = o.Raw(sql2, memberId, memberId, keyword, offset, pageSize).QueryRows(&books) + _, err = o.Raw(sql2, memberId, memberId, keyword, pageSize, offset).QueryRows(&books) return @@ -622,9 +622,9 @@ WHERE (relationship_id > 0 OR book.privately_owned = 0 or team.team_member_id > sql := `SELECT book.*,rel.*,mdmb.account AS create_name FROM md_books AS book LEFT JOIN md_relationship AS rel ON rel.book_id = book.book_id AND rel.role_id = 0 LEFT JOIN md_members AS mdmb ON rel.member_id = mdmb.member_id - WHERE book.privately_owned = 0 AND book.label LIKE ? ORDER BY order_index DESC ,book.book_id DESC LIMIT ?,?` + WHERE book.privately_owned = 0 AND book.label LIKE ? ORDER BY order_index DESC ,book.book_id DESC limit ? offset ?` - _, err = o.Raw(sql, keyword, offset, pageSize).QueryRows(&books) + _, err = o.Raw(sql, keyword, pageSize, offset).QueryRows(&books) return diff --git a/models/BookResult.go b/models/BookResult.go index 1fb42491..0ea535bc 100644 --- a/models/BookResult.go +++ b/models/BookResult.go @@ -176,11 +176,11 @@ func (m *BookResult) FindToPager(pageIndex, pageSize int) (books []*BookResult, FROM md_books AS book LEFT JOIN md_relationship AS rel ON rel.book_id = book.book_id AND rel.role_id = 0 LEFT JOIN md_members AS m ON rel.member_id = m.member_id - ORDER BY book.order_index DESC ,book.book_id DESC LIMIT ?,?` + ORDER BY book.order_index DESC ,book.book_id DESC limit ? offset ?` offset := (pageIndex - 1) * pageSize - _, err = o.Raw(sql, offset, pageSize).QueryRows(&books) + _, err = o.Raw(sql, pageSize, offset).QueryRows(&books) return } diff --git a/models/DocumentHistory.go b/models/DocumentHistory.go index 02aee2a0..1d026e1c 100644 --- a/models/DocumentHistory.go +++ b/models/DocumentHistory.go @@ -165,9 +165,9 @@ func (m *DocumentHistory) FindToPager(docId, pageIndex, pageSize int) (docs []*D FROM md_document_history AS history LEFT JOIN md_members AS m1 ON history.member_id = m1.member_id LEFT JOIN md_members AS m2 ON history.modify_at = m2.member_id -WHERE history.document_id = ? ORDER BY history.history_id DESC LIMIT ?,?;` +WHERE history.document_id = ? ORDER BY history.history_id DESC limit ? offset ?;` - _, err = o.Raw(sql, docId, offset, pageSize).QueryRows(&docs) + _, err = o.Raw(sql, docId, pageSize, offset).QueryRows(&docs) if err != nil { return diff --git a/models/DocumentSearchResult.go b/models/DocumentSearchResult.go index afb751de..5be74055 100644 --- a/models/DocumentSearchResult.go +++ b/models/DocumentSearchResult.go @@ -96,7 +96,7 @@ WHERE book.privately_owned = 0 AND (book.book_name LIKE ? OR book.description LI WHERE blog.blog_status = 'public' AND (blog.blog_release LIKE ? OR blog.blog_title LIKE ?) ) AS union_table ORDER BY create_time DESC -LIMIT ?, ?;` +LIMIT ? OFFSET ?;` err = o.Raw(sql1, keyword, keyword).QueryRow(&totalCount) if err != nil { @@ -128,7 +128,7 @@ WHERE book.privately_owned = 0 AND (book.book_name LIKE ? OR book.description LI totalCount += c - _, err = o.Raw(sql2, keyword, keyword, keyword, keyword, keyword, keyword, offset, pageSize).QueryRows(&searchResult) + _, err = o.Raw(sql2, keyword, keyword, keyword, keyword, keyword, keyword, pageSize, offset).QueryRows(&searchResult) if err != nil { logs.Error("查询搜索结果失败 -> ", err) return @@ -224,7 +224,7 @@ FROM ( (blog.blog_release LIKE ? OR blog.blog_title LIKE ?) ) AS union_table ORDER BY create_time DESC -LIMIT ?, ?;` +LIMIT ? OFFSET ?;` err = o.Raw(sql1, memberId, memberId, keyword, keyword).QueryRow(&totalCount) if err != nil { @@ -262,7 +262,7 @@ WHERE (book.privately_owned = 0 OR rel1.relationship_id > 0 or team.team_member_ totalCount += c - _, err = o.Raw(sql2, memberId, memberId, keyword, keyword, memberId, memberId, keyword, keyword, memberId, keyword, keyword, offset, pageSize).QueryRows(&searchResult) + _, err = o.Raw(sql2, memberId, memberId, keyword, keyword, memberId, memberId, keyword, keyword, memberId, keyword, keyword, pageSize, offset).QueryRows(&searchResult) if err != nil { return } diff --git a/models/Itemsets.go b/models/Itemsets.go index 11e88d6f..fe053157 100644 --- a/models/Itemsets.go +++ b/models/Itemsets.go @@ -246,9 +246,9 @@ as t group by book_id) as team LEFT JOIN md_relationship AS rel1 ON rel1.book_id = book.book_id AND rel1.role_id = 0 LEFT JOIN md_members AS mdmb ON rel1.member_id = mdmb.member_id WHERE book.item_id = ? AND (book.privately_owned = 0 or rel.role_id >= 0 or team.role_id >= 0) - ORDER BY order_index desc,book.book_id DESC LIMIT ?,?` + ORDER BY order_index desc,book.book_id DESC limit ? offset ?` - _, err = o.Raw(sql2, memberId, memberId, item.ItemId, offset, pageSize).QueryRows(&books) + _, err = o.Raw(sql2, memberId, memberId, item.ItemId, pageSize, offset).QueryRows(&books) return @@ -264,9 +264,9 @@ as t group by book_id) as team sql := `SELECT book.*,rel.*,mdmb.account AS create_name FROM md_books AS book LEFT JOIN md_relationship AS rel ON rel.book_id = book.book_id AND rel.role_id = 0 LEFT JOIN md_members AS mdmb ON rel.member_id = mdmb.member_id - WHERE book.item_id = ? AND book.privately_owned = 0 ORDER BY order_index desc,book.book_id DESC LIMIT ?,?` + WHERE book.item_id = ? AND book.privately_owned = 0 ORDER BY order_index desc,book.book_id DESC limit ? offset ?` - _, err = o.Raw(sql, item.ItemId, offset, pageSize).QueryRows(&books) + _, err = o.Raw(sql, item.ItemId, pageSize, offset).QueryRows(&books) return diff --git a/models/MemberResult.go b/models/MemberResult.go index 3926ae0a..8688e85b 100644 --- a/models/MemberResult.go +++ b/models/MemberResult.go @@ -72,7 +72,7 @@ func (m *MemberRelationshipResult) FindForUsersByBookId(lang string, bookId, pag var members []*MemberRelationshipResult - sql1 := "SELECT * FROM md_relationship AS rel LEFT JOIN md_members as mdmb ON rel.member_id = mdmb.member_id WHERE rel.book_id = ? ORDER BY rel.relationship_id DESC LIMIT ?,?" + sql1 := "SELECT * FROM md_relationship AS rel LEFT JOIN md_members as mdmb ON rel.member_id = mdmb.member_id WHERE rel.book_id = ? ORDER BY rel.relationship_id DESC limit ? offset ?" sql2 := "SELECT count(*) AS total_count FROM md_relationship AS rel LEFT JOIN md_members as mdmb ON rel.member_id = mdmb.member_id WHERE rel.book_id = ?" @@ -86,7 +86,7 @@ func (m *MemberRelationshipResult) FindForUsersByBookId(lang string, bookId, pag offset := (pageIndex - 1) * pageSize - _, err = o.Raw(sql1, bookId, offset, pageSize).QueryRows(&members) + _, err = o.Raw(sql1, bookId, pageSize, offset).QueryRows(&members) if err != nil { return members, 0, err diff --git a/models/Team.go b/models/Team.go index cf974602..a980376e 100644 --- a/models/Team.go +++ b/models/Team.go @@ -12,10 +12,10 @@ import ( //团队. type Team struct { TeamId int `orm:"column(team_id);pk;auto;unique;" json:"team_id"` - TeamName string `orm:"column(team_name);size(255);description(团队名称)" json:"team_name"` - MemberId int `orm:"column(member_id);type(int);description(创建人id)" json:"member_id"` - IsDelete bool `orm:"column(is_delete);default(0);description(是否删除 0:否 1:是)" json:"is_delete"` - CreateTime time.Time `orm:"column(create_time);type(datetime);auto_now_add;description(创建时间)" json:"create_time"` + TeamName string `orm:"column(team_name);size(255);description(团队名称)" json:"team_name"` + MemberId int `orm:"column(member_id);type(int);description(创建人id)" json:"member_id"` + IsDelete bool `orm:"column(is_delete);default(false);description(是否删除 false:否 true:是)" json:"is_delete"` + CreateTime time.Time `orm:"column(create_time);type(datetime);auto_now_add;description(创建时间)" json:"create_time"` MemberCount int `orm:"-" json:"member_count"` BookCount int `orm:"-" json:"book_count"` MemberName string `orm:"-" json:"member_name"`