मेरे पास एक टेबल user_permissions
है जिसमें 4612 कॉलम id
और created_date
के साथ 46 अनुमति कॉलम हैं।Slick - पूर्ण ऑब्जेक्ट या 22 से अधिक कॉलम अपडेट करें
class UserPermission(val id: Long,
val createdDate: Option[Timestamp],
val permission1: Boolean,
val permission2: Boolean,
...
val permission46: Boolean)
और चालाक मानचित्रण तालिका
class UserPermissions(tag: Tag) extends Table[UserPermission](tag, "users_permissions") {
def * = (
id ::
createdDate ::
permission1 ::
permission2 ::
...
permission46 ::
HNil).shaped <> (
{ case x => UserPermission(
x(0), x(1), x(2), ... x(47))
},
{
UserPermission.unapply _
}
}
... <columns defined here>
)
अब मैं UserPermission सेट जो id
द्वारा पहचाना जाता है अद्यतन करना चाहते: यह तालिका एक इसी UserPermissions
वर्ग है। समारोह है कि मैंने यह है:
object UserPermissions {
val userPermissions = TableQuery[UserPermissions]
def update(userPermission: UserPermission)(implicit session: Session) = {
userPermissions.filter(_.id === userPermission.id.get).update(userPermission)
}
}
यह काम नहीं कर रहा है और फेंक अपवाद:
play.api.Application$$anon$1: Execution exception[[SQLServerException: Cannot update identity column 'id'.]]
जो समझ में आता है के रूप में स्लिक द्वारा उत्पन्न एसक्यूएल है:
update "users_permissions" set "id" = ?, "created_date" = ?, ...
समस्या 1 तो मेरी पहली समस्या यह है कि मैं एक पूर्ण UserPermission
ऑब्जेक्ट अपडेट करने में असमर्थ हूं slick। यदि मेरे पास इस समस्या का समाधान है तो यह बहुत अच्छा होगा।
जब से मैं पूरी वस्तु को अद्यतन करने में असमर्थ हूँ तो मैं कॉलम मैं तो अद्यतन एक अद्यतन क्वेरी सक्रिय करना चाहते हैं yield
करने के लिए सोचा। कोड इस तरह दिखता है:
def update(obj: UserPermission)(implicit session: Session) = {
val query = for {
p <- userPermissions
if p.id === obj.id.get
} yield (p.permission1, p.permission2, ... p.permission46)
query.update(obj.permission1, obj.permission2, ... obj.permission46)
}
समस्या 2 अब चालाक query.update()
समारोह में 46 कॉलम अपडेट नहीं हो रहा है। यह एक समय में केवल 22 कॉलम संभाल सकता है। मैं अपना UserPermissions
ऑब्जेक्ट कैसे अपडेट कर सकता हूं?
एक बुरा समाधान मुझे लगता है कि 22 बार पहली बार अपडेट करना है, फिर 22 सेकंड, फिर तीसरे प्रश्न में 2। यह 3 डीबी अद्यतन प्रश्न होंगे जो मैं नहीं चाहता हूं।
मेरी समस्या का कोई समाधान?
निर्भरता हैं:
scalaVersion := "2.11.4"
"com.typesafe.play" %% "play-slick" % "0.8.1"
"com.typesafe.slick" %% "slick-extensions" % "2.1.0"
सुझाव प्रदान करने के लिए धन्यवाद। मैंने पोस्टिंग से पहले ही उन्हें पहले ही माना है लेकिन मैं इनमें से किसी भी को लागू नहीं कर सकता। 'प्ले' और 'स्लिक' को अपग्रेड करने के रूप में भविष्य के स्पिंट्स का हिस्सा हैं और टेबल लेआउट को उत्पादन प्रणालियों में बदला नहीं जा सकता है और कई अनुप्रयोगों को वर्तमान तालिका डिज़ाइन के साथ कसकर जोड़ दिया जाता है ताकि वे सभी प्रभावित हो जाएं। –