diff --git a/.gitignore b/.gitignore index 79fdf16..e2a3877 100644 --- a/.gitignore +++ b/.gitignore @@ -7,5 +7,5 @@ *_test.go *.txt *.text -gomod.sh +go_mod.sh /vendor/ diff --git a/README.md b/README.md index bb6f064..da36649 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@

-Golang Dorm +Golang

📦 Golang Dorm @@ -13,5 +13,5 @@ #### 安装 ```shell -go get -v -u go.dtapp.net/dorm +go get -v -u go.dtapp.net/dorm@v1.0.56 ``` diff --git a/go.mod b/go.mod index fb1ce07..98d1b7c 100644 --- a/go.mod +++ b/go.mod @@ -4,18 +4,18 @@ go 1.21.5 require ( github.com/basgys/goxml2json v1.1.0 - github.com/redis/go-redis/v9 v9.3.1 + github.com/redis/go-redis/v9 v9.4.0 github.com/sirupsen/logrus v1.9.3 - go.dtapp.net/gojson v1.0.2 + go.dtapp.net/gojson v1.0.4 go.dtapp.net/gotime v1.0.6 + go.mongodb.org/mongo-driver v1.13.1 gorm.io/driver/mysql v1.5.2 gorm.io/driver/postgres v1.5.4 - gorm.io/gen v0.3.24 - gorm.io/gorm v1.25.5 + gorm.io/gen v0.3.25 + gorm.io/gorm v1.25.6 ) require ( - github.com/bitly/go-simplejson v0.5.1 // indirect github.com/bytedance/sonic v1.10.2 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d // indirect @@ -23,25 +23,32 @@ require ( github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect github.com/go-sql-driver/mysql v1.7.1 // indirect github.com/goccy/go-json v0.10.2 // indirect + github.com/golang/snappy v0.0.4 // indirect github.com/jackc/pgpassfile v1.0.0 // indirect github.com/jackc/pgservicefile v0.0.0-20231201235250-de7065d80cb9 // indirect - github.com/jackc/pgx/v5 v5.5.1 // indirect + github.com/jackc/pgx/v5 v5.5.2 // indirect github.com/jackc/puddle/v2 v2.2.1 // indirect github.com/jinzhu/inflection v1.0.0 // indirect github.com/jinzhu/now v1.1.5 // indirect github.com/json-iterator/go v1.1.12 // indirect + github.com/klauspost/compress v1.17.5 // indirect github.com/klauspost/cpuid/v2 v2.2.6 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/montanaflynn/stats v0.7.1 // indirect github.com/twitchyliquid64/golang-asm v0.15.1 // indirect - golang.org/x/arch v0.6.0 // indirect - golang.org/x/crypto v0.17.0 // indirect + github.com/xdg-go/pbkdf2 v1.0.0 // indirect + github.com/xdg-go/scram v1.1.2 // indirect + github.com/xdg-go/stringprep v1.0.4 // indirect + github.com/youmark/pkcs8 v0.0.0-20201027041543-1326539a0a0a // indirect + golang.org/x/arch v0.7.0 // indirect + golang.org/x/crypto v0.18.0 // indirect golang.org/x/mod v0.14.0 // indirect - golang.org/x/net v0.19.0 // indirect - golang.org/x/sync v0.5.0 // indirect - golang.org/x/sys v0.15.0 // indirect + golang.org/x/net v0.20.0 // indirect + golang.org/x/sync v0.6.0 // indirect + golang.org/x/sys v0.16.0 // indirect golang.org/x/text v0.14.0 // indirect - golang.org/x/tools v0.16.1 // indirect + golang.org/x/tools v0.17.0 // indirect gorm.io/datatypes v1.2.0 // indirect gorm.io/hints v1.1.2 // indirect gorm.io/plugin/dbresolver v1.5.0 // indirect diff --git a/go.sum b/go.sum index 7004a4c..48af8a2 100644 --- a/go.sum +++ b/go.sum @@ -34,13 +34,18 @@ github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 h1:au07oEsX2xN0kt github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= github.com/golang-sql/sqlexp v0.1.0 h1:ZCD6MBpcuOVfGVqsEmY5/4FtYiKz6tSyUv9LPEDei6A= github.com/golang-sql/sqlexp v0.1.0/go.mod h1:J4ad9Vo8ZCWQ2GMrC4UCQy1JpCbwU9m3EOqtpKwwwHI= +github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= +github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/google/go-cmp v0.5.2 h1:X2ev0eStA3AbceY54o37/0PQ/UWqKEiiO2dKL5OPaFM= +github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= github.com/jackc/pgservicefile v0.0.0-20231201235250-de7065d80cb9 h1:L0QtFUgDarD7Fpv9jeVMgy/+Ec0mtnmYuImjTz6dtDA= github.com/jackc/pgservicefile v0.0.0-20231201235250-de7065d80cb9/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= -github.com/jackc/pgx/v5 v5.5.1 h1:5I9etrGkLrN+2XPCsi6XLlV5DITbSL/xBZdmAxFcXPI= -github.com/jackc/pgx/v5 v5.5.1/go.mod h1:Ig06C2Vu0t5qXC60W8sqIthScaEnFvojjj9dSljmHRA= +github.com/jackc/pgx/v5 v5.5.2 h1:iLlpgp4Cp/gC9Xuscl7lFL1PhhW+ZLtXZcrfCt4C3tA= +github.com/jackc/pgx/v5 v5.5.2/go.mod h1:ez9gk+OAat140fv9ErkZDYFWmXLfV+++K0uAOiwgm1A= github.com/jackc/puddle/v2 v2.2.1 h1:RhxXJtFG022u4ibrCSMSiu5aOq1i77R3OHKNJj77OAk= github.com/jackc/puddle/v2 v2.2.1/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= @@ -50,6 +55,9 @@ github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ= github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= +github.com/klauspost/compress v1.17.5 h1:d4vBd+7CHydUqpFBgUEKkSdtSugf9YFmSkvUYPquI5E= +github.com/klauspost/compress v1.17.5/go.mod h1:/dCuZOvVtNoHsyb+cuJD3itjs3NbnF6KH9zAO4BDxPM= github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.2.6 h1:ndNyv040zDGIDh8thGkXYjnFtiN02M1PVVF+JE/48xc= github.com/klauspost/cpuid/v2 v2.2.6/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= @@ -64,10 +72,13 @@ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= +github.com/montanaflynn/stats v0.7.1 h1:etflOAAHORrCC44V+aR6Ftzort912ZU+YLiSTuV8eaE= +github.com/montanaflynn/stats v0.7.1/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/redis/go-redis/v9 v9.3.1 h1:KqdY8U+3X6z+iACvumCNxnoluToB+9Me+TvyFa21Mds= -github.com/redis/go-redis/v9 v9.3.1/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M= +github.com/redis/go-redis/v9 v9.4.0 h1:Yzoz33UZw9I/mFhx4MNrB6Fk+XHO1VukNcCa1+lwyKk= +github.com/redis/go-redis/v9 v9.4.0/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= @@ -77,34 +88,78 @@ github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UV github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8= -github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= -go.dtapp.net/gojson v1.0.2 h1:NjslBOhAK3XvJepkML7LXcJRPtSfp3rDXGK/29VlDBw= -go.dtapp.net/gojson v1.0.2/go.mod h1:U0Vd2iSLKqdyg6oungBJVHxuYswTbeQVjruQC3/JqQ4= +github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c= +github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= +github.com/xdg-go/scram v1.1.2 h1:FHX5I5B4i4hKRVRBCFRxq1iQRej7WO3hhBuJf+UUySY= +github.com/xdg-go/scram v1.1.2/go.mod h1:RT/sEzTbU5y00aCK8UOx6R7YryM0iF1N2MOmC3kKLN4= +github.com/xdg-go/stringprep v1.0.4 h1:XLI/Ng3O1Atzq0oBs3TWm+5ZVgkq2aqdlvP9JtoZ6c8= +github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM= +github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA= +github.com/youmark/pkcs8 v0.0.0-20201027041543-1326539a0a0a h1:fZHgsYlfvtyqToslyjUt3VOPF4J7aK/3MPcK7xp3PDk= +github.com/youmark/pkcs8 v0.0.0-20201027041543-1326539a0a0a/go.mod h1:ul22v+Nro/R083muKhosV54bj5niojjWZvU8xrevuH4= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +go.dtapp.net/gojson v1.0.4 h1:9en9iyOOLWoEIo2eKhqt3/Djh/3HhwsTpXxgI9efPRo= +go.dtapp.net/gojson v1.0.4/go.mod h1:G9CMVzNSRkbNzIic/vJqHCOyKtw6BW2YM8Vyn64zfM0= go.dtapp.net/gotime v1.0.6 h1:f8YowUxpZtJbYawe5s5PmvGxRj61ydlzxAPYr5Fcetg= go.dtapp.net/gotime v1.0.6/go.mod h1:Gq7eNLr2iMLP18UNWONRq4V3Uhf/ADp4bIrS+Tc6ktY= +go.mongodb.org/mongo-driver v1.13.1 h1:YIc7HTYsKndGK4RFzJ3covLz1byri52x0IoMB0Pt/vk= +go.mongodb.org/mongo-driver v1.13.1/go.mod h1:wcDf1JBCXy2mOW0bWHwO/IOYqdca1MPCwDtFu/Z9+eo= golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= -golang.org/x/arch v0.6.0 h1:S0JTfE48HbRj80+4tbvZDYsJ3tGv6BUU3XxyZ7CirAc= -golang.org/x/arch v0.6.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys= -golang.org/x/crypto v0.17.0 h1:r8bRNjWL3GshPW3gkd+RpvzWrZAwPS49OmTGZ/uhM4k= -golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= +golang.org/x/arch v0.7.0 h1:pskyeJh/3AmoQ8CPE95vxHLqp1G1GfGNXTmcl9NEKTc= +golang.org/x/arch v0.7.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.18.0 h1:PGVlW0xEltQnzFZ55hkuX5+KLyrMYhHld1YHO4AKcdc= +golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.14.0 h1:dGoOF9QVLYng8IHTm7BAyWqCqSheQ5pYWGhzW00YJr0= golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= -golang.org/x/net v0.19.0 h1:zTwKpTd2XuCqf8huc7Fo2iSy+4RHPd10s4KzeTnVr1c= -golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U= -golang.org/x/sync v0.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE= -golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.20.0 h1:aCL9BSgETF1k+blQaYUBx9hJ9LOGP3gAVemcZlf1Kpo= +golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= +golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc= -golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.16.0 h1:xWw16ngr6ZMtmxDyKyIgsE93KNKz5HKmMa3b8ALHidU= +golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/tools v0.16.1 h1:TLyB3WofjdOEepBHAU20JdNC1Zbg87elYofWYAY5oZA= -golang.org/x/tools v0.16.1/go.mod h1:kYVVN6I1mBNoB1OX+noeBjbRk4IUEPa7JJ+TJMEooJ0= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.17.0 h1:FvmRgNOcs3kOa+T20R1uhfP9F6HgG2mfxDv1vrx1Htc= +golang.org/x/tools v0.17.0/go.mod h1:xsh6VxdV005rRVaS6SSAf9oiAqljS7UZUacMZ8Bnsps= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= @@ -120,15 +175,15 @@ gorm.io/driver/sqlite v1.5.0 h1:zKYbzRCpBrT1bNijRnxLDJWPjVfImGEn0lSnUY5gZ+c= gorm.io/driver/sqlite v1.5.0/go.mod h1:kDMDfntV9u/vuMmz8APHtHF0b4nyBB7sfCieC6G8k8I= gorm.io/driver/sqlserver v1.4.1 h1:t4r4r6Jam5E6ejqP7N82qAJIJAht27EGT41HyPfXRw0= gorm.io/driver/sqlserver v1.4.1/go.mod h1:DJ4P+MeZbc5rvY58PnmN1Lnyvb5gw5NPzGshHDnJLig= -gorm.io/gen v0.3.24 h1:yL1RrCySwTWTQpkUkt2FCe42Xub2eaZP2tM5EQoFBNU= -gorm.io/gen v0.3.24/go.mod h1:G9uxGfkfNFxPoOrV5P6KQxRMgZsQSCyp9vJP8xiKTGg= +gorm.io/gen v0.3.25 h1:uT/1YfvcnYUdike4XPYyi89FEnVHZF115GUXQm2Sfug= +gorm.io/gen v0.3.25/go.mod h1:p+t0iCKjaPz+pKRxcx63nXdRgnrah/QD2l92747ihyA= gorm.io/gorm v1.23.8/go.mod h1:l2lP/RyAtc1ynaTjFksBde/O8v9oOGIApu2/xRitmZk= gorm.io/gorm v1.24.7-0.20230306060331-85eaf9eeda11/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k= gorm.io/gorm v1.25.0/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k= gorm.io/gorm v1.25.2-0.20230530020048-26663ab9bf55/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k= gorm.io/gorm v1.25.2/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k= -gorm.io/gorm v1.25.5 h1:zR9lOiiYf09VNh5Q1gphfyia1JpiClIWG9hQaxB/mls= -gorm.io/gorm v1.25.5/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8= +gorm.io/gorm v1.25.6 h1:V92+vVda1wEISSOMtodHVRcUIOPYa2tgQtyF+DfFx+A= +gorm.io/gorm v1.25.6/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8= gorm.io/hints v1.1.2 h1:b5j0kwk5p4+3BtDtYqqfY+ATSxjj+6ptPgVveuynn9o= gorm.io/hints v1.1.2/go.mod h1:/ARdpUHAtyEMCh5NNi3tI7FsGh+Cj/MIUlvNxCNCFWg= gorm.io/plugin/dbresolver v1.5.0 h1:XVHLxh775eP0CqVh3vcfJtYqja3uFl5Wr3cKlY8jgDY= diff --git a/mongo.go b/mongo.go new file mode 100644 index 0000000..474e81b --- /dev/null +++ b/mongo.go @@ -0,0 +1,66 @@ +package dorm + +import ( + "context" + "errors" + "fmt" + "go.mongodb.org/mongo-driver/mongo" + "go.mongodb.org/mongo-driver/mongo/options" +) + +// MongoClientFun *MongoClient 驱动 +// string 库名 +type MongoClientFun func() (*MongoClient, string) + +// MongoClientCollectionFun *MongoClient 驱动 +// string 库名 +// string 集合 +type MongoClientCollectionFun func() (*MongoClient, string, string) + +// MongoClientConfig 实例配置 +type MongoClientConfig struct { + Dns string // 地址 + Opts *options.ClientOptions + DatabaseName string // 库名 +} + +// MongoClient 实例 +type MongoClient struct { + db *mongo.Client // 驱动 + configDatabaseName string // 库名 +} + +// NewMongoClient 创建实例 +func NewMongoClient(ctx context.Context, config *MongoClientConfig) (*MongoClient, error) { + + var err error + c := &MongoClient{} + + c.configDatabaseName = config.DatabaseName + + // 连接到MongoDB + if config.Dns != "" { + c.db, err = mongo.Connect(ctx, options.Client().ApplyURI(config.Dns)) + if err != nil { + return nil, errors.New(fmt.Sprintf("连接失败:%v", err)) + } + } else { + c.db, err = mongo.Connect(ctx, config.Opts) + if err != nil { + return nil, errors.New(fmt.Sprintf("连接失败:%v", err)) + } + } + + // 检查连接 + err = c.db.Ping(ctx, nil) + if err != nil { + return nil, errors.New(fmt.Sprintf("检查连接失败:%v", err)) + } + + return c, nil +} + +// Close 关闭 +func (c *MongoClient) Close(ctx context.Context) error { + return c.db.Disconnect(ctx) +} diff --git a/mongo_collection.go b/mongo_collection.go new file mode 100644 index 0000000..0488037 --- /dev/null +++ b/mongo_collection.go @@ -0,0 +1,60 @@ +package dorm + +import ( + "context" + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/mongo" + "go.mongodb.org/mongo-driver/mongo/options" +) + +type MongoCollectionOptions struct { + db *mongo.Client // 驱动 + configDatabaseName string // 库名 + dbCollection *mongo.Collection // 集合 +} + +// Collection 选择集合 +func (cd *MongoDatabaseOptions) Collection(name string, opts ...*options.CollectionOptions) *MongoCollectionOptions { + return &MongoCollectionOptions{ + db: cd.db, // 驱动 + configDatabaseName: cd.configDatabaseName, // 库名 + dbCollection: cd.dbDatabase.Collection(name, opts...), // 集合 + } +} + +// CreateOneIndexes 创建一个索引 +func (cc *MongoCollectionOptions) CreateOneIndexes(ctx context.Context, key string, value string) (string, error) { + return cc.dbCollection.Indexes().CreateOne(ctx, mongo.IndexModel{ + Keys: bson.D{{ + Key: key, + Value: value, + }}, + }) +} + +// CreateOneUniqueIndexes 创建一个唯一索引 +func (cc *MongoCollectionOptions) CreateOneUniqueIndexes(ctx context.Context, key string, value string) (string, error) { + return cc.dbCollection.Indexes().CreateOne(ctx, mongo.IndexModel{ + Keys: bson.D{{ + Key: key, + Value: value, + }}, + Options: options.Index().SetUnique(true), + }) +} + +// CreateOneUniqueIndexesOpts 创建一个索引 +func (cc *MongoCollectionOptions) CreateOneUniqueIndexesOpts(ctx context.Context, key string, value string, opts *options.IndexOptions) (string, error) { + return cc.dbCollection.Indexes().CreateOne(ctx, mongo.IndexModel{ + Keys: bson.D{{ + Key: key, + Value: value, + }}, + Options: opts, + }) +} + +// CreateManyIndexes 创建多个索引 +func (cc *MongoCollectionOptions) CreateManyIndexes(ctx context.Context, models []mongo.IndexModel) ([]string, error) { + return cc.dbCollection.Indexes().CreateMany(ctx, models) +} diff --git a/mongo_collection_curd.go b/mongo_collection_curd.go new file mode 100644 index 0000000..fde133e --- /dev/null +++ b/mongo_collection_curd.go @@ -0,0 +1,100 @@ +package dorm + +import ( + "context" + "go.mongodb.org/mongo-driver/mongo" + "go.mongodb.org/mongo-driver/mongo/options" +) + +// InsertOne 插入一个文档 +func (cc *MongoCollectionOptions) InsertOne(ctx context.Context, document interface{}, opts ...*options.InsertOneOptions) (*mongo.InsertOneResult, error) { + return cc.dbCollection.InsertOne(ctx, document, opts...) +} + +// InsertMany 插入多个文档 +func (cc *MongoCollectionOptions) InsertMany(ctx context.Context, document []interface{}, opts ...*options.InsertManyOptions) (*mongo.InsertManyResult, error) { + return cc.dbCollection.InsertMany(ctx, document, opts...) +} + +// DeleteOne 删除一个文档 +func (cc *MongoCollectionOptions) DeleteOne(ctx context.Context, filter interface{}, opts ...*options.DeleteOptions) (*mongo.DeleteResult, error) { + return cc.dbCollection.DeleteOne(ctx, filter, opts...) +} + +// DeleteMany 删除多个文档 +func (cc *MongoCollectionOptions) DeleteMany(ctx context.Context, filter interface{}, opts ...*options.DeleteOptions) (*mongo.DeleteResult, error) { + return cc.dbCollection.DeleteMany(ctx, filter, opts...) +} + +// UpdateByID 按ID更新 +func (cc *MongoCollectionOptions) UpdateByID(ctx context.Context, id interface{}, update interface{}, opts ...*options.UpdateOptions) (*mongo.UpdateResult, error) { + return cc.dbCollection.UpdateByID(ctx, id, update, opts...) +} + +// UpdateOne 更新一个文档 +func (cc *MongoCollectionOptions) UpdateOne(ctx context.Context, filter interface{}, update interface{}, opts ...*options.UpdateOptions) (*mongo.UpdateResult, error) { + return cc.dbCollection.UpdateOne(ctx, filter, update, opts...) +} + +// UpdateMany 更新多个文档 +func (cc *MongoCollectionOptions) UpdateMany(ctx context.Context, filter interface{}, update interface{}, opts ...*options.UpdateOptions) (*mongo.UpdateResult, error) { + return cc.dbCollection.UpdateMany(ctx, filter, update, opts...) +} + +// ReplaceOne 替换一个文档 +func (cc *MongoCollectionOptions) ReplaceOne(ctx context.Context, filter interface{}, update interface{}, opts ...*options.ReplaceOptions) (*mongo.UpdateResult, error) { + return cc.dbCollection.ReplaceOne(ctx, filter, update, opts...) +} + +// Aggregate 统计分析 +func (cc *MongoCollectionOptions) Aggregate(ctx context.Context, pipeline interface{}, opts ...*options.AggregateOptions) (*mongo.Cursor, error) { + return cc.dbCollection.Aggregate(ctx, pipeline, opts...) +} + +// CountDocuments 计数文档 +func (cc *MongoCollectionOptions) CountDocuments(ctx context.Context, filter interface{}, opts ...*options.CountOptions) (int64, error) { + return cc.dbCollection.CountDocuments(ctx, filter, opts...) +} + +// EstimatedDocumentCount 估计文档计数 +func (cc *MongoCollectionOptions) EstimatedDocumentCount(ctx context.Context, opts ...*options.EstimatedDocumentCountOptions) (int64, error) { + return cc.dbCollection.EstimatedDocumentCount(ctx, opts...) +} + +func (cc *MongoCollectionOptions) Distinct(ctx context.Context, fieldName string, filter interface{}, opts ...*options.DistinctOptions) ([]interface{}, error) { + return cc.dbCollection.Distinct(ctx, fieldName, filter, opts...) +} + +// Find 查询多个文档 +func (cc *MongoCollectionOptions) Find(ctx context.Context, filter interface{}, opts ...*options.FindOptions) (*mongo.Cursor, error) { + return cc.dbCollection.Find(ctx, filter, opts...) +} + +// FindOne 查询一个文档 +func (cc *MongoCollectionOptions) FindOne(ctx context.Context, filter interface{}, opts ...*options.FindOneOptions) *mongo.SingleResult { + return cc.dbCollection.FindOne(ctx, filter, opts...) +} + +func (cc *MongoCollectionOptions) FindOneAndDelete(ctx context.Context, filter interface{}, opts ...*options.FindOneAndDeleteOptions) *mongo.SingleResult { + return cc.dbCollection.FindOneAndDelete(ctx, filter, opts...) +} + +func (cc *MongoCollectionOptions) FindOneAndReplace(ctx context.Context, filter interface{}, replacement interface{}, opts ...*options.FindOneAndReplaceOptions) *mongo.SingleResult { + return cc.dbCollection.FindOneAndReplace(ctx, filter, replacement, opts...) +} + +func (cc *MongoCollectionOptions) FindOneAndUpdate(ctx context.Context, filter interface{}, replacement interface{}, opts ...*options.FindOneAndUpdateOptions) *mongo.SingleResult { + return cc.dbCollection.FindOneAndUpdate(ctx, filter, replacement, opts...) +} + +func (cc *MongoCollectionOptions) Watch(ctx context.Context, pipeline interface{}, opts ...*options.ChangeStreamOptions) (*mongo.ChangeStream, error) { + return cc.dbCollection.Watch(ctx, pipeline, opts...) +} + +func (cc *MongoCollectionOptions) Indexes(ctx context.Context) mongo.IndexView { + return cc.dbCollection.Indexes() +} + +func (cc *MongoCollectionOptions) Drop(ctx context.Context) error { + return cc.dbCollection.Drop(ctx) +} diff --git a/mongo_database.go b/mongo_database.go new file mode 100644 index 0000000..c285ace --- /dev/null +++ b/mongo_database.go @@ -0,0 +1,69 @@ +package dorm + +import ( + "context" + "go.mongodb.org/mongo-driver/mongo" + "go.mongodb.org/mongo-driver/mongo/options" + "reflect" +) + +type MongoDatabaseOptions struct { + db *mongo.Client // 驱动 + configDatabaseName string // 库名 + dbDatabase *mongo.Database // 数据库 +} + +// Database 选择数据库 +func (c *MongoClient) Database(name string, opts ...*options.DatabaseOptions) *MongoDatabaseOptions { + return &MongoDatabaseOptions{ + db: c.db, // 驱动 + configDatabaseName: c.configDatabaseName, // 库名 + dbDatabase: c.db.Database(name, opts...), // 数据库 + } +} + +// CreateCollection 创建集合 +func (cd *MongoDatabaseOptions) CreateCollection(ctx context.Context, name string, opts ...*options.CreateCollectionOptions) error { + return cd.dbDatabase.CreateCollection(ctx, name, opts...) +} + +// CreateTimeSeriesCollection 创建时间序列集合 +func (cd *MongoDatabaseOptions) CreateTimeSeriesCollection(ctx context.Context, name string, timeField string) error { + return cd.dbDatabase.CreateCollection(ctx, name, options.CreateCollection().SetTimeSeriesOptions(options.TimeSeries().SetTimeField(timeField))) +} + +// Model 传入模型自动获取库名和表名 +// https://studygolang.com/articles/896 +// DatabaseName 库名 +// CollectionName 集合名 +func (c *MongoClient) Model(value interface{}) *MongoCollectionOptions { + + var databaseOptions *MongoDatabaseOptions + var collectionOptions *MongoCollectionOptions + + val := reflect.ValueOf(value) + + methodDatabaseNameValue := val.MethodByName("DatabaseName") + if methodDatabaseNameValue.IsValid() { + databaseName := methodDatabaseNameValue.Call(nil)[0].String() + databaseOptions = c.Database(databaseName) + } else { + databaseOptions = c.Database(c.configDatabaseName) + } + + methodCollectionNameValue := val.MethodByName("CollectionName") + if methodCollectionNameValue.IsValid() { + collectionName := methodCollectionNameValue.Call(nil)[0].String() + collectionOptions = databaseOptions.Collection(collectionName) + } else { + methodTableNameValue := val.MethodByName("TableName") + if methodTableNameValue.IsValid() { + collectionName := methodTableNameValue.Call(nil)[0].String() + collectionOptions = databaseOptions.Collection(collectionName) + } else { + panic(NoConfigCollectionName) + } + } + + return collectionOptions +} diff --git a/mongo_error.go b/mongo_error.go new file mode 100644 index 0000000..bf85790 --- /dev/null +++ b/mongo_error.go @@ -0,0 +1,8 @@ +package dorm + +import "errors" + +var ( + NoConfigDatabaseName = errors.New("没有配置库名") + NoConfigCollectionName = errors.New("没有配置集合名") +) diff --git a/mongo_get.go b/mongo_get.go new file mode 100644 index 0000000..7aea68b --- /dev/null +++ b/mongo_get.go @@ -0,0 +1,8 @@ +package dorm + +import "go.mongodb.org/mongo-driver/mongo" + +// GetDb 获取驱动 +func (c *MongoClient) GetDb() *mongo.Client { + return c.db +} diff --git a/mongo_session.go b/mongo_session.go new file mode 100644 index 0000000..13c700e --- /dev/null +++ b/mongo_session.go @@ -0,0 +1,59 @@ +package dorm + +import ( + "context" + "go.mongodb.org/mongo-driver/mongo" + "log" +) + +type MongoSessionOptions struct { + db *mongo.Client // 驱动 + configDatabaseName string // 库名 + session mongo.Session // 会话 + sessionContext mongo.SessionContext // 会话上下文 +} + +// Begin 开始事务,会同时创建开始会话需要在退出时关闭会话 +func (c *MongoClient) Begin() *MongoSessionOptions { + + var ctx = context.TODO() + var err error + ms := &MongoSessionOptions{} + + ms.db = c.GetDb() + ms.configDatabaseName = c.configDatabaseName + + // 开始会话 + ms.session, err = ms.db.StartSession() + if err != nil { + log.Println("开始会话异常:", err) + } + + // 会话上下文 + ms.sessionContext = mongo.NewSessionContext(ctx, ms.session) + + // 会话开启事务 + err = ms.session.StartTransaction() + + return ms +} + +// Rollback 回滚事务 +func (cs *MongoSessionOptions) Rollback() { + var ctx = context.TODO() + err := cs.session.AbortTransaction(ctx) + if err != nil { + log.Println("回滚事务异常:", err) + } + cs.session.EndSession(ctx) +} + +// Commit 提交事务 +func (cs *MongoSessionOptions) Commit() { + var ctx = context.TODO() + err := cs.session.CommitTransaction(ctx) + if err != nil { + log.Println("提交事务异常:", err) + } + cs.session.EndSession(ctx) +} diff --git a/mongo_session_collection.go b/mongo_session_collection.go new file mode 100644 index 0000000..c2c0cf4 --- /dev/null +++ b/mongo_session_collection.go @@ -0,0 +1,25 @@ +package dorm + +import ( + "go.mongodb.org/mongo-driver/mongo" + "go.mongodb.org/mongo-driver/mongo/options" +) + +type MongoSessionCollectionOptions struct { + db *mongo.Client // 驱动 + configDatabaseName string // 库名 + session mongo.Session // 会话 + sessionContext mongo.SessionContext // 会话上下文 + dbCollection *mongo.Collection // 集合 +} + +// Collection 选择集合 +func (csd *MongoSessionDatabaseOptions) Collection(name string, opts ...*options.CollectionOptions) *MongoSessionCollectionOptions { + return &MongoSessionCollectionOptions{ + db: csd.db, // 驱动 + configDatabaseName: csd.configDatabaseName, // 库名 + session: csd.session, // 会话 + sessionContext: csd.sessionContext, // 会话上下文 + dbCollection: csd.dbDatabase.Collection(name, opts...), // 集合 + } +} diff --git a/mongo_session_collection_curd.go b/mongo_session_collection_curd.go new file mode 100644 index 0000000..00c9d04 --- /dev/null +++ b/mongo_session_collection_curd.go @@ -0,0 +1,99 @@ +package dorm + +import ( + "go.mongodb.org/mongo-driver/mongo" + "go.mongodb.org/mongo-driver/mongo/options" +) + +// InsertOne 插入一个文档 +func (csc *MongoSessionCollectionOptions) InsertOne(document interface{}, opts ...*options.InsertOneOptions) (*mongo.InsertOneResult, error) { + return csc.dbCollection.InsertOne(csc.sessionContext, document, opts...) +} + +// InsertMany 插入多个文档 +func (csc *MongoSessionCollectionOptions) InsertMany(document []interface{}, opts ...*options.InsertManyOptions) (*mongo.InsertManyResult, error) { + return csc.dbCollection.InsertMany(csc.sessionContext, document, opts...) +} + +// DeleteOne 删除一个文档 +func (csc *MongoSessionCollectionOptions) DeleteOne(filter interface{}, opts ...*options.DeleteOptions) (*mongo.DeleteResult, error) { + return csc.dbCollection.DeleteOne(csc.sessionContext, filter, opts...) +} + +// DeleteMany 删除多个文档 +func (csc *MongoSessionCollectionOptions) DeleteMany(filter interface{}, opts ...*options.DeleteOptions) (*mongo.DeleteResult, error) { + return csc.dbCollection.DeleteMany(csc.sessionContext, filter, opts...) +} + +// UpdateByID 按ID更新 +func (csc *MongoSessionCollectionOptions) UpdateByID(id interface{}, update interface{}, opts ...*options.UpdateOptions) (*mongo.UpdateResult, error) { + return csc.dbCollection.UpdateByID(csc.sessionContext, id, update, opts...) +} + +// UpdateOne 更新一个文档 +func (csc *MongoSessionCollectionOptions) UpdateOne(filter interface{}, update interface{}, opts ...*options.UpdateOptions) (*mongo.UpdateResult, error) { + return csc.dbCollection.UpdateOne(csc.sessionContext, filter, update, opts...) +} + +// UpdateMany 更新多个文档 +func (csc *MongoSessionCollectionOptions) UpdateMany(filter interface{}, update interface{}, opts ...*options.UpdateOptions) (*mongo.UpdateResult, error) { + return csc.dbCollection.UpdateMany(csc.sessionContext, filter, update, opts...) +} + +// ReplaceOne 替换一个文档 +func (csc *MongoSessionCollectionOptions) ReplaceOne(filter interface{}, update interface{}, opts ...*options.ReplaceOptions) (*mongo.UpdateResult, error) { + return csc.dbCollection.ReplaceOne(csc.sessionContext, filter, update, opts...) +} + +// Aggregate 统计分析 +func (csc *MongoSessionCollectionOptions) Aggregate(pipeline interface{}, opts ...*options.AggregateOptions) (*mongo.Cursor, error) { + return csc.dbCollection.Aggregate(csc.sessionContext, pipeline, opts...) +} + +// CountDocuments 计数文档 +func (csc *MongoSessionCollectionOptions) CountDocuments(filter interface{}, opts ...*options.CountOptions) (int64, error) { + return csc.dbCollection.CountDocuments(csc.sessionContext, filter, opts...) +} + +// EstimatedDocumentCount 估计文档计数 +func (csc *MongoSessionCollectionOptions) EstimatedDocumentCount(opts ...*options.EstimatedDocumentCountOptions) (int64, error) { + return csc.dbCollection.EstimatedDocumentCount(csc.sessionContext, opts...) +} + +func (csc *MongoSessionCollectionOptions) Distinct(fieldName string, filter interface{}, opts ...*options.DistinctOptions) ([]interface{}, error) { + return csc.dbCollection.Distinct(csc.sessionContext, fieldName, filter, opts...) +} + +// Find 查询多个文档 +func (csc *MongoSessionCollectionOptions) Find(filter interface{}, opts ...*options.FindOptions) (*mongo.Cursor, error) { + return csc.dbCollection.Find(csc.sessionContext, filter, opts...) +} + +// FindOne 查询一个文档 +func (csc *MongoSessionCollectionOptions) FindOne(filter interface{}, opts ...*options.FindOneOptions) *mongo.SingleResult { + return csc.dbCollection.FindOne(csc.sessionContext, filter, opts...) +} + +func (csc *MongoSessionCollectionOptions) FindOneAndDelete(filter interface{}, opts ...*options.FindOneAndDeleteOptions) *mongo.SingleResult { + return csc.dbCollection.FindOneAndDelete(csc.sessionContext, filter, opts...) +} + +func (csc *MongoSessionCollectionOptions) FindOneAndReplace(filter interface{}, replacement interface{}, opts ...*options.FindOneAndReplaceOptions) *mongo.SingleResult { + return csc.dbCollection.FindOneAndReplace(csc.sessionContext, filter, replacement, opts...) +} + +func (csc *MongoSessionCollectionOptions) FindOneAndUpdate(filter interface{}, replacement interface{}, opts ...*options.FindOneAndUpdateOptions) *mongo.SingleResult { + return csc.dbCollection.FindOneAndUpdate(csc.sessionContext, filter, replacement, opts...) +} + +func (csc *MongoSessionCollectionOptions) Watch(pipeline interface{}, opts ...*options.ChangeStreamOptions) (*mongo.ChangeStream, error) { + return csc.dbCollection.Watch(csc.sessionContext, pipeline, opts...) +} + +func (csc *MongoSessionCollectionOptions) Indexes() mongo.IndexView { + return csc.dbCollection.Indexes() +} + +func (csc *MongoSessionCollectionOptions) Drop() error { + return csc.dbCollection.Drop(csc.sessionContext) +} diff --git a/mongo_session_database.go b/mongo_session_database.go new file mode 100644 index 0000000..26d5d77 --- /dev/null +++ b/mongo_session_database.go @@ -0,0 +1,62 @@ +package dorm + +import ( + "go.mongodb.org/mongo-driver/mongo" + "go.mongodb.org/mongo-driver/mongo/options" + "reflect" +) + +type MongoSessionDatabaseOptions struct { + db *mongo.Client // 驱动 + configDatabaseName string // 库名 + session mongo.Session // 会话 + sessionContext mongo.SessionContext // 会话上下文 + dbDatabase *mongo.Database // 数据库 +} + +// Database 选择数据库 +func (cs *MongoSessionOptions) Database(name string, opts ...*options.DatabaseOptions) *MongoSessionDatabaseOptions { + return &MongoSessionDatabaseOptions{ + db: cs.db, // 驱动 + configDatabaseName: cs.configDatabaseName, // 库名 + session: cs.session, // 会话 + sessionContext: cs.sessionContext, // 会话上下文 + dbDatabase: cs.db.Database(name, opts...), // 数据库 + } +} + +// Model 传入模型自动获取库名和表名 +// https://studygolang.com/articles/896 +// DatabaseName 库名 +// CollectionName 集合名 +func (cs *MongoSessionOptions) Model(value interface{}) *MongoSessionCollectionOptions { + + var sessionDatabaseOptions *MongoSessionDatabaseOptions + var sessionCollectionOptions *MongoSessionCollectionOptions + + val := reflect.ValueOf(value) + + methodDatabaseNameValue := val.MethodByName("DatabaseName") + if methodDatabaseNameValue.IsValid() { + databaseName := methodDatabaseNameValue.Call(nil)[0].String() + sessionDatabaseOptions = cs.Database(databaseName) + } else { + sessionDatabaseOptions = cs.Database(cs.configDatabaseName) + } + + methodCollectionNameValue := val.MethodByName("CollectionName") + if methodCollectionNameValue.IsValid() { + collectionName := methodCollectionNameValue.Call(nil)[0].String() + sessionCollectionOptions = sessionDatabaseOptions.Collection(collectionName) + } else { + methodTableNameValue := val.MethodByName("TableName") + if methodTableNameValue.IsValid() { + collectionName := methodTableNameValue.Call(nil)[0].String() + sessionCollectionOptions = sessionDatabaseOptions.Collection(collectionName) + } else { + panic(NoConfigCollectionName) + } + } + + return sessionCollectionOptions +} diff --git a/mongo_session_get.go b/mongo_session_get.go new file mode 100644 index 0000000..6c904c1 --- /dev/null +++ b/mongo_session_get.go @@ -0,0 +1,18 @@ +package dorm + +import "go.mongodb.org/mongo-driver/mongo" + +// GetDb 获取驱动 +func (cs *MongoSessionOptions) GetDb() *mongo.Client { + return cs.db +} + +// GetSession 获取会话 +func (cs *MongoSessionOptions) GetSession() mongo.Session { + return cs.session +} + +// GetSessionContext 获取会话上下文 +func (cs *MongoSessionOptions) GetSessionContext() mongo.SessionContext { + return cs.sessionContext +} diff --git a/mongo_time.go b/mongo_time.go new file mode 100644 index 0000000..393e9e9 --- /dev/null +++ b/mongo_time.go @@ -0,0 +1,85 @@ +package dorm + +import ( + "go.dtapp.net/gotime" + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/bson/bsontype" + "time" +) + +// BsonTime 时间类型 +type BsonTime time.Time + +// MarshalJSON 实现json序列化 +func (bt BsonTime) MarshalJSON() ([]byte, error) { + + b := make([]byte, 0) + b = append(b, '"') + b = append(b, gotime.SetCurrent(time.Time(bt)).Bson()...) + b = append(b, '"') + + return b, nil +} + +// UnmarshalJSON 实现json反序列化 +func (bt *BsonTime) UnmarshalJSON(data []byte) (err error) { + + if string(data) == "null" { + return nil + } + + bsonTime := gotime.SetCurrentParse(string(data)) + *bt = BsonTime(bsonTime.Time) + + return nil +} + +// Time 转时间 +func (bt BsonTime) Time() time.Time { + return gotime.SetCurrent(time.Time(bt)).Time +} + +// Format 转时间字符串 +func (bt BsonTime) Format() string { + return gotime.SetCurrent(time.Time(bt)).Format() +} + +// TimePro 转时间操作 +func (bt BsonTime) TimePro() gotime.Pro { + return gotime.SetCurrent(time.Time(bt)) +} + +// NewBsonTimeCurrent 创建当前时间 +func NewBsonTimeCurrent() BsonTime { + return BsonTime(gotime.Current().Time) +} + +// NewBsonTimeFromTime 创建某个时间 +func NewBsonTimeFromTime(t time.Time) BsonTime { + return BsonTime(t) +} + +// NewBsonTimeFromString 创建某个时间 字符串 +func NewBsonTimeFromString(t string) BsonTime { + return BsonTime(gotime.SetCurrentParse(t).Time) +} + +// Value 时间类型 +func (bt BsonTime) Value() string { + return gotime.SetCurrent(time.Time(bt)).Bson() +} + +// MarshalBSONValue 实现bson序列化 +func (bt BsonTime) MarshalBSONValue() (bsontype.Type, []byte, error) { + return bson.MarshalValue(gotime.SetCurrent(time.Time(bt)).Bson()) +} + +// UnmarshalBSONValue 实现bson反序列化 +func (bt *BsonTime) UnmarshalBSONValue(t bsontype.Type, data []byte) error { + t1 := gotime.SetCurrentParse(string(data)) + //if string(data) == "" { + // return errors.New(fmt.Sprintf("%s, %s, %s", "读取数据失败:", t, data)) + //} + *bt = BsonTime(t1.Time) + return nil +} diff --git a/version.go b/version.go new file mode 100644 index 0000000..01c55a8 --- /dev/null +++ b/version.go @@ -0,0 +1,3 @@ +package dorm + +const Version = "1.0.56" diff --git a/vsrsion.go b/vsrsion.go deleted file mode 100644 index bf0279c..0000000 --- a/vsrsion.go +++ /dev/null @@ -1,3 +0,0 @@ -package dorm - -const Version = "1.0.55"