Skip to content

Commit 1f74810

Browse files
committed
implement ALTER table support
1 parent d21dcc2 commit 1f74810

File tree

2 files changed

+28
-6
lines changed

2 files changed

+28
-6
lines changed

Sources/FluentPostgreSQL/PostgreSQLDatabase+SchemaSupporting.swift

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,15 @@ extension PostgreSQLQuery {
3434
columns: fluent.createColumns,
3535
constraints: fluent.createConstraints
3636
))
37-
case .alter: fatalError()
37+
case .alter:
38+
query = .alterTable(.init(
39+
ifExists: false,
40+
name: fluent.table,
41+
addColumns: fluent.createColumns,
42+
dropColumns: fluent.deleteColumns.map { $0.name },
43+
addConstraints: fluent.createConstraints,
44+
dropConstraints: fluent.deleteConstraints.map { $0.name ?? "unknown" }
45+
))
3846
case .drop:
3947
query = .dropTable(.init(name: fluent.table, ifExists: false))
4048
}
@@ -61,7 +69,7 @@ extension PostgreSQLDatabase: SchemaSupporting {
6169

6270
public static func schemaField(for type: Any.Type, isIdentifier: Bool, _ column: PostgreSQLQuery.Column) -> PostgreSQLQuery.ColumnDefinition {
6371
var constraints: [PostgreSQLQuery.ColumnConstraint] = []
64-
let dataType: PostgreSQLQuery.DataType
72+
var dataType: PostgreSQLQuery.DataType
6573

6674
var type = type
6775
if let optional = type as? AnyOptionalType.Type {
@@ -90,10 +98,19 @@ extension PostgreSQLDatabase: SchemaSupporting {
9098
}
9199

92100
if isIdentifier {
93-
switch dataType {
94-
case .smallint, .integer, .bigint:
95-
constraints.append(.init(.generated(.byDefault)))
96-
default: break
101+
if _globalEnableIdentityColumns {
102+
switch dataType {
103+
case .smallint, .integer, .bigint:
104+
constraints.append(.init(.generated(.byDefault)))
105+
default: break
106+
}
107+
} else {
108+
switch dataType {
109+
case .smallint: dataType = .smallserial
110+
case .integer: dataType = .serial
111+
case .bigint: dataType = .bigserial
112+
default: break
113+
}
97114
}
98115

99116
// create a unique name for the primary key since it will be added

Tests/FluentPostgreSQLTests/FluentPostgreSQLTests.swift

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -325,6 +325,7 @@ class FluentPostgreSQLTests: XCTestCase {
325325
var id: Int?
326326
let name: String
327327
let type: PlanetType
328+
let test: String?
328329

329330
static func prepare(on conn: PostgreSQLConnection) -> Future<Void> {
330331
return PostgreSQLDatabase.create(Planet.self, on: conn) { builder in
@@ -346,6 +347,10 @@ class FluentPostgreSQLTests: XCTestCase {
346347

347348
let rows = try Planet.query(on: conn).filter(\.type == .gasGiant).all().wait()
348349
XCTAssertEqual(rows.count, 0)
350+
351+
try PostgreSQLDatabase.update(Planet.self, on: conn) { builder in
352+
builder.field(for: \.test)
353+
}.wait()
349354
}
350355

351356
func testContains() throws {

0 commit comments

Comments
 (0)