Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
二次元的罪恶王冠
beego
提交
11247d41
B
beego
项目概览
二次元的罪恶王冠
/
beego
与 Fork 源项目一致
从无法访问的项目Fork
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
B
beego
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
11247d41
编写于
9月 12, 2016
作者:
W
Wang Yujian
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Add support "SELECT FOR UPDATE" to orm. Resolve issue #2157
上级
dd0f05b1
变更
6
隐藏空白更改
内联
并排
Showing
6 changed file
with
36 addition
and
5 deletion
+36
-5
orm/db.go
orm/db.go
+7
-2
orm/orm.go
orm/orm.go
+12
-2
orm/qb.go
orm/qb.go
+1
-0
orm/qb_mysql.go
orm/qb_mysql.go
+6
-0
orm/qb_tidb.go
orm/qb_tidb.go
+6
-0
orm/types.go
orm/types.go
+4
-1
未找到文件。
orm/db.go
浏览文件 @
11247d41
...
...
@@ -310,7 +310,7 @@ func (d *dbBase) InsertStmt(stmt stmtQuerier, mi *modelInfo, ind reflect.Value,
}
// query sql ,read records and persist in dbBaser.
func
(
d
*
dbBase
)
Read
(
q
dbQuerier
,
mi
*
modelInfo
,
ind
reflect
.
Value
,
tz
*
time
.
Location
,
cols
[]
string
)
error
{
func
(
d
*
dbBase
)
Read
(
q
dbQuerier
,
mi
*
modelInfo
,
ind
reflect
.
Value
,
tz
*
time
.
Location
,
cols
[]
string
,
isForUpdate
bool
)
error
{
var
whereCols
[]
string
var
args
[]
interface
{}
...
...
@@ -341,7 +341,12 @@ func (d *dbBase) Read(q dbQuerier, mi *modelInfo, ind reflect.Value, tz *time.Lo
sep
=
fmt
.
Sprintf
(
"%s = ? AND %s"
,
Q
,
Q
)
wheres
:=
strings
.
Join
(
whereCols
,
sep
)
query
:=
fmt
.
Sprintf
(
"SELECT %s%s%s FROM %s%s%s WHERE %s%s%s = ?"
,
Q
,
sels
,
Q
,
Q
,
mi
.
table
,
Q
,
Q
,
wheres
,
Q
)
forUpdate
:=
""
if
isForUpdate
{
forUpdate
=
"FOR UPDATE"
}
query
:=
fmt
.
Sprintf
(
"SELECT %s%s%s FROM %s%s%s WHERE %s%s%s = ? %s"
,
Q
,
sels
,
Q
,
Q
,
mi
.
table
,
Q
,
Q
,
wheres
,
Q
,
forUpdate
)
refs
:=
make
([]
interface
{},
colsNum
)
for
i
:=
range
refs
{
...
...
orm/orm.go
浏览文件 @
11247d41
...
...
@@ -122,7 +122,17 @@ func (o *orm) getFieldInfo(mi *modelInfo, name string) *fieldInfo {
// read data to model
func
(
o
*
orm
)
Read
(
md
interface
{},
cols
...
string
)
error
{
mi
,
ind
:=
o
.
getMiInd
(
md
,
true
)
err
:=
o
.
alias
.
DbBaser
.
Read
(
o
.
db
,
mi
,
ind
,
o
.
alias
.
TZ
,
cols
)
err
:=
o
.
alias
.
DbBaser
.
Read
(
o
.
db
,
mi
,
ind
,
o
.
alias
.
TZ
,
cols
,
false
)
if
err
!=
nil
{
return
err
}
return
nil
}
// read data to model, like Read(), but use "SELECT FOR UPDATE" form
func
(
o
*
orm
)
ReadForUpdate
(
md
interface
{},
cols
...
string
)
error
{
mi
,
ind
:=
o
.
getMiInd
(
md
,
true
)
err
:=
o
.
alias
.
DbBaser
.
Read
(
o
.
db
,
mi
,
ind
,
o
.
alias
.
TZ
,
cols
,
true
)
if
err
!=
nil
{
return
err
}
...
...
@@ -133,7 +143,7 @@ func (o *orm) Read(md interface{}, cols ...string) error {
func
(
o
*
orm
)
ReadOrCreate
(
md
interface
{},
col1
string
,
cols
...
string
)
(
bool
,
int64
,
error
)
{
cols
=
append
([]
string
{
col1
},
cols
...
)
mi
,
ind
:=
o
.
getMiInd
(
md
,
true
)
err
:=
o
.
alias
.
DbBaser
.
Read
(
o
.
db
,
mi
,
ind
,
o
.
alias
.
TZ
,
cols
)
err
:=
o
.
alias
.
DbBaser
.
Read
(
o
.
db
,
mi
,
ind
,
o
.
alias
.
TZ
,
cols
,
false
)
if
err
==
ErrNoRows
{
// Create
id
,
err
:=
o
.
Insert
(
md
)
...
...
orm/qb.go
浏览文件 @
11247d41
...
...
@@ -19,6 +19,7 @@ import "errors"
// QueryBuilder is the Query builder interface
type
QueryBuilder
interface
{
Select
(
fields
...
string
)
QueryBuilder
ForUpdate
()
QueryBuilder
From
(
tables
...
string
)
QueryBuilder
InnerJoin
(
table
string
)
QueryBuilder
LeftJoin
(
table
string
)
QueryBuilder
...
...
orm/qb_mysql.go
浏览文件 @
11247d41
...
...
@@ -34,6 +34,12 @@ func (qb *MySQLQueryBuilder) Select(fields ...string) QueryBuilder {
return
qb
}
// ForUpdate add the FOR UPDATE clause
func
(
qb
*
MySQLQueryBuilder
)
ForUpdate
()
QueryBuilder
{
qb
.
Tokens
=
append
(
qb
.
Tokens
,
"FOR UPDATE"
)
return
qb
}
// From join the tables
func
(
qb
*
MySQLQueryBuilder
)
From
(
tables
...
string
)
QueryBuilder
{
qb
.
Tokens
=
append
(
qb
.
Tokens
,
"FROM"
,
strings
.
Join
(
tables
,
CommaSpace
))
...
...
orm/qb_tidb.go
浏览文件 @
11247d41
...
...
@@ -31,6 +31,12 @@ func (qb *TiDBQueryBuilder) Select(fields ...string) QueryBuilder {
return
qb
}
// ForUpdate add the FOR UPDATE clause
func
(
qb
*
TiDBQueryBuilder
)
ForUpdate
()
QueryBuilder
{
qb
.
Tokens
=
append
(
qb
.
Tokens
,
"FOR UPDATE"
)
return
qb
}
// From join the tables
func
(
qb
*
TiDBQueryBuilder
)
From
(
tables
...
string
)
QueryBuilder
{
qb
.
Tokens
=
append
(
qb
.
Tokens
,
"FROM"
,
strings
.
Join
(
tables
,
CommaSpace
))
...
...
orm/types.go
浏览文件 @
11247d41
...
...
@@ -45,6 +45,9 @@ type Ormer interface {
// u = &User{UserName: "astaxie", Password: "pass"}
// err = Ormer.Read(u, "UserName")
Read
(
md
interface
{},
cols
...
string
)
error
// Like Read(), but with "FOR UPDATE" clause, useful in transaction.
// Some databases are not support this feature.
ReadForUpdate
(
md
interface
{},
cols
...
string
)
error
// Try to read a row from the database, or insert one if it doesn't exist
ReadOrCreate
(
md
interface
{},
col1
string
,
cols
...
string
)
(
bool
,
int64
,
error
)
// insert model data to database
...
...
@@ -394,7 +397,7 @@ type txEnder interface {
// base database struct
type
dbBaser
interface
{
Read
(
dbQuerier
,
*
modelInfo
,
reflect
.
Value
,
*
time
.
Location
,
[]
string
)
error
Read
(
dbQuerier
,
*
modelInfo
,
reflect
.
Value
,
*
time
.
Location
,
[]
string
,
bool
)
error
Insert
(
dbQuerier
,
*
modelInfo
,
reflect
.
Value
,
*
time
.
Location
)
(
int64
,
error
)
InsertOrUpdate
(
dbQuerier
,
*
modelInfo
,
reflect
.
Value
,
*
alias
,
...
string
)
(
int64
,
error
)
InsertMulti
(
dbQuerier
,
*
modelInfo
,
reflect
.
Value
,
int
,
*
time
.
Location
)
(
int64
,
error
)
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录