xorm基础学习
- 为什么要学习xorm
- 原本的JDBC操作数据库已经满足我们的所有需求了,但是我们还要提出一个概念叫做:orm(Object-Relation Mapping),一种对象与关系型数据库之间的映射,也可以说将对象持久化到磁盘。通过这样的技术能够将减少代码、便于理解和操作数据库、是数据访问层和数据库层清晰分界、而且能够提高服务器的性能
package main
import (
"log"
"os"
"github.com/go-xorm/xorm"
"xorm.io/core"
_ "github.com/lib/pq"
)
var engine *xorm.Engine
func init() {
log.SetFlags(log.Ldate | log.Lshortfile)
var err error
connStr := "postgres://postgres:ysm@121388@localhost/experiment?sslmode=disable"
engine, err = xorm.NewEngine("postgres", connStr)
if err != nil {
log.Println(err)
}
log.Println("开启postgres数据成功")
f, err := os.OpenFile("sql.log", os.O_APPEND|os.O_CREATE|os.O_RDWR, 0666)
if err != nil {
log.Println(err)
return
}
engine.SetLogger(xorm.NewSimpleLogger(f))
engine.Logger().SetLevel(core.LOG_DEBUG)
engine.ShowSQL(true)
}
type TPhoto struct {
Id int64 `xorm:"pk notnull unique autoincr"`
Content string `xorm:"notnull"`
Version int64 `xorm:"version"`
UpdateTime int64 `xorm:"updated"`
CreateTime int64 `xorm:"created"`
Name string `xorm:"varchar notnull"`
}
func ShowAllTables() {
info, err := engine.DBMetas()
if err != nil {
log.Println(err)
return
}
for _, v := range info {
log.Println(v.Name)
}
}
func createTable() {
tPhoto := &TPhoto{}
isExist, err := engine.IsTableExist("t_photo")
if err != nil {
log.Println(err)
return
}
if !isExist {
err := engine.CreateTables(tPhoto)
if err != nil {
log.Println(err)
}
}
err = engine.Sync2(tPhoto)
if err != nil {
log.Println(err)
}
}
func createTableSQL() {
SQL := "create table t_small_photo(id int primary key,name varchar)"
isExit, err := engine.IsTableExist("t_small_photo")
if err != nil {
log.Println(err)
return
}
if isExit {
log.Println("t_small_photo已经存在")
}
_, err = engine.Exec(SQL)
if err != nil {
log.Println(err)
return
}
isExit, err = engine.IsTableExist("t_small_photo")
if err != nil {
log.Println(err)
return
}
if isExit {
log.Println("t_small_photo存在")
}
}
func dropTable() {
tPhoto := &TPhoto{}
isExist, err := engine.IsTableExist("t_photo")
if err != nil {
log.Println(err)
return
}
if !isExist {
err := engine.DropTables(tPhoto)
if err != nil {
log.Println(err)
}
}
}
func insertData() {
tPhoto := &TPhoto{Content: "content1", Name: "name1"}
_, err := engine.Insert(tPhoto)
if err != nil {
log.Println(err)
return
}
tPhotos := []*TPhoto{
{Content: "content2", Name: "name2"},
{Content: "content3", Name: "name3"},
{Content: "content4", Name: "name4"},
{Content: "content5", Name: "name5"},
}
_, err = engine.Insert(&tPhotos)
if err != nil {
log.Println(err)
}
}
func insertDataSQL() {
SQL := "insert into t_photo (content,name) values($1,$2)"
_, err := engine.Exec(SQL, "content7", "name7")
if err != nil {
log.Println(err)
return
}
}
func selectData() {
tPhoto := &TPhoto{}
isHas, err := engine.Get(tPhoto)
if err != nil {
log.Println(err)
return
}
log.Println(isHas)
log.Println(tPhoto)
tPhotos := make([]TPhoto, 0)
err = engine.Find(&tPhotos)
if err != nil {
log.Println(err)
return
}
log.Println(tPhotos)
tPhotos1 := make([]TPhoto, 0)
err = engine.Where("content = ?", "content1").And("name =?", "name1").Find(&tPhotos1)
if err != nil {
log.Println(err)
return
}
log.Println(tPhotos1)
tPhtot1 := &TPhoto{}
isHas, err = engine.Select("id,content,name").Where("id = ?", 1).Get(tPhtot1)
if err != nil {
log.Println(err)
return
}
if isHas {
log.Println(tPhtot1)
}
}
func count() {
tPhtot1 := &TPhoto{}
num,err := engine.Where("id = ?", 1).Count(tPhtot1)
if err!=nil{
log.Println(err)
return
}
log.Println(num)
}
func updateData(){
tPhtot1 := &TPhoto{Content:"content12",Name: "name12",Version: 1}
affect,err := engine.Where("id = ?",1).Cols("content,name").Update(tPhtot1)
if err!=nil{
log.Println(err)
return
}
log.Println("affect:",affect)
tPhotos := make([]TPhoto,0)
err = engine.Where("id = ?",1).Find(&tPhotos)
if err!=nil{
log.Println(err)
return
}
log.Println(tPhotos)
}
func main() {
log.Println("学习log")
updateData()
}
注意:当在创建表的对象中有version标记的时候,即是有乐观锁的时候,在update的时候,需要带上version的内容
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)