Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit b5da9d5

Browse files
Merge pull request #77 from vapor/alter-table-drop
add support for ALTER TABLE drop actions
2 parents 8a0d67c + 01e07e5 commit b5da9d5

File tree

3 files changed

+81
-21
lines changed

3 files changed

+81
-21
lines changed

‎Sources/FluentPostgreSQL/PostgreSQLDatabase+QuerySupporting.swift

Lines changed: 0 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -115,25 +115,4 @@ extension PostgreSQLDatabase: QuerySupporting {
115115

116116
return conn.future(model)
117117
}
118-
119-
/// See `SchemaSupporting`.
120-
public static func schemaExecute(_ fluent: FluentPostgreSQLSchema, on conn: PostgreSQLConnection) -> Future<Void> {
121-
let query: PostgreSQLQuery
122-
switch fluent.statement {
123-
case ._createTable:
124-
var createTable: PostgreSQLCreateTable = .createTable(fluent.table)
125-
createTable.columns = fluent.columns
126-
createTable.tableConstraints = fluent.constraints
127-
query = ._createTable(createTable)
128-
case ._alterTable:
129-
var alterTable: PostgreSQLAlterTable = .alterTable(fluent.table)
130-
alterTable.columns = fluent.columns
131-
alterTable.constraints = fluent.constraints
132-
query = ._alterTable(alterTable)
133-
case ._dropTable:
134-
let dropTable: PostgreSQLDropTable = .dropTable(fluent.table)
135-
query = ._dropTable(dropTable)
136-
}
137-
return conn.query(query).transform(to: ())
138-
}
139118
}

‎Sources/FluentPostgreSQL/PostgreSQLDatabase+SchemaSupporting.swift

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,34 @@ extension PostgreSQLDatabase: SchemaSupporting {
2424
/// See `SchemaSupporting`.
2525
public typealias SchemaReferenceAction = PostgreSQLForeignKeyAction
2626

27+
/// See `SchemaSupporting`.
28+
public static func schemaExecute(_ fluent: FluentPostgreSQLSchema, on conn: PostgreSQLConnection) -> Future<Void> {
29+
let query: PostgreSQLQuery
30+
switch fluent.statement {
31+
case ._createTable:
32+
var createTable: PostgreSQLCreateTable = .createTable(fluent.table)
33+
createTable.columns = fluent.columns
34+
createTable.tableConstraints = fluent.constraints
35+
query = ._createTable(createTable)
36+
case ._alterTable:
37+
var alterTable: PostgreSQLAlterTable = .alterTable(fluent.table)
38+
alterTable.columns = fluent.columns
39+
alterTable.constraints = fluent.constraints
40+
alterTable.dropActions += fluent.deleteColumns.map { .init(.column, 0ドル.identifier) }
41+
alterTable.dropActions += fluent.deleteConstraints.map {
42+
guard let id = 0ドル.identifier else {
43+
fatalError("Cannot drop constraint without identifier: \(0ドル).")
44+
}
45+
return .init(.constraint, id)
46+
}
47+
query = ._alterTable(alterTable)
48+
case ._dropTable:
49+
let dropTable: PostgreSQLDropTable = .dropTable(fluent.table)
50+
query = ._dropTable(dropTable)
51+
}
52+
return conn.query(query).transform(to: ())
53+
}
54+
2755
/// See `SchemaSupporting`.
2856
public static func schemaField(for type: Any.Type, isIdentifier: Bool, _ column: PostgreSQLColumnIdentifier) -> PostgreSQLColumnDefinition {
2957
var constraints: [PostgreSQLColumnConstraint] = []

‎Tests/FluentPostgreSQLTests/FluentPostgreSQLTests.swift

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -406,6 +406,59 @@ class FluentPostgreSQLTests: XCTestCase {
406406
XCTAssertEqual(b.id, 1)
407407
}
408408

409+
func testAlterDrop() throws {
410+
struct A: PostgreSQLMigration {
411+
static func prepare(on conn: PostgreSQLConnection) -> Future<Void> {
412+
return PostgreSQLDatabase.create(Planet.self, on: conn) { builder in
413+
builder.field(for: \.id)
414+
}
415+
}
416+
417+
static func revert(on conn: PostgreSQLConnection) -> Future<Void> {
418+
return PostgreSQLDatabase.delete(Planet.self, on: conn)
419+
}
420+
}
421+
struct B: PostgreSQLMigration {
422+
static func prepare(on conn: PostgreSQLConnection) -> Future<Void> {
423+
return PostgreSQLDatabase.update(Planet.self, on: conn) { builder in
424+
builder.field(for: \.name)
425+
builder.deleteField(for: \.id)
426+
}
427+
}
428+
429+
static func revert(on conn: PostgreSQLConnection) -> Future<Void> {
430+
return PostgreSQLDatabase.update(Planet.self, on: conn) { builder in
431+
builder.deleteField(for: \.name)
432+
builder.field(for: \.id)
433+
}
434+
}
435+
}
436+
struct C: PostgreSQLMigration {
437+
static func prepare(on conn: PostgreSQLConnection) -> Future<Void> {
438+
return PostgreSQLDatabase.update(Planet.self, on: conn) { builder in
439+
builder.unique(on: \.name)
440+
}
441+
}
442+
443+
static func revert(on conn: PostgreSQLConnection) -> Future<Void> {
444+
return PostgreSQLDatabase.update(Planet.self, on: conn) { builder in
445+
builder.deleteUnique(from: \.name)
446+
}
447+
}
448+
}
449+
450+
let conn = try benchmarker.pool.requestConnection().wait()
451+
conn.logger = DatabaseLogger(database: .psql, handler: PrintLogHandler())
452+
defer { benchmarker.pool.releaseConnection(conn) }
453+
454+
try A.prepare(on: conn).wait()
455+
defer { try? A.revert(on: conn).wait() }
456+
try B.prepare(on: conn).wait()
457+
defer { try? B.revert(on: conn).wait() }
458+
try C.prepare(on: conn).wait()
459+
defer { try? C.revert(on: conn).wait() }
460+
}
461+
409462
static let allTests = [
410463
("testBenchmark", testBenchmark),
411464
("testNestedStruct", testNestedStruct),

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /