@@ -156,6 +156,14 @@ func (c *Cassandra) Open(url string) (database.Driver, error) {
156156 }
157157 }
158158
159+ if len (u .Query ().Get ("disable-host-lookup" )) > 0 {
160+ if flag , err := strconv .ParseBool (u .Query ().Get ("disable-host-lookup" )); err != nil && flag {
161+ cluster .DisableInitialHostLookup = true
162+ } else if err != nil {
163+ return nil , err
164+ }
165+ }
166+
159167 session , err := cluster .CreateSession ()
160168 if err != nil {
161169 return nil , err
@@ -228,16 +236,26 @@ func (c *Cassandra) Run(migration io.Reader) error {
228236}
229237
230238func (c * Cassandra ) SetVersion (version int , dirty bool ) error {
231- query := `TRUNCATE "` + c .config .MigrationsTable + `"`
232- if err := c .session .Query (query ).Exec (); err != nil {
233- return & database.Error {OrigErr : err , Query : []byte (query )}
239+ // DELETE instead of TRUNCATE because AWS Keyspaces does not support it
240+ // see: https://docs.aws.amazon.com/keyspaces/latest/devguide/cassandra-apis.html
241+ squery := `SELECT version FROM "` + c .config .MigrationsTable + `"`
242+ dquery := `DELETE FROM "` + c .config .MigrationsTable + `" WHERE version = ?`
243+ iter := c .session .Query (squery ).Iter ()
244+ var previous int
245+ for iter .Scan (& previous ) {
246+ if err := c .session .Query (dquery , previous ).Exec (); err != nil {
247+ return & database.Error {OrigErr : err , Query : []byte (dquery )}
248+ }
249+ }
250+ if err := iter .Close (); err != nil {
251+ return & database.Error {OrigErr : err , Query : []byte (squery )}
234252 }
235253
236254 // Also re-write the schema version for nil dirty versions to prevent
237255 // empty schema version for failed down migration on the first migration
238256 // See: https://github.com/golang-migrate/migrate/issues/330
239257 if version >= 0 || (version == database .NilVersion && dirty ) {
240- query = `INSERT INTO "` + c .config .MigrationsTable + `" (version, dirty) VALUES (?, ?)`
258+ query : = `INSERT INTO "` + c .config .MigrationsTable + `" (version, dirty) VALUES (?, ?)`
241259 if err := c .session .Query (query , version , dirty ).Exec (); err != nil {
242260 return & database.Error {OrigErr : err , Query : []byte (query )}
243261 }
0 commit comments