Skip to content

Commit e7ec7a1

Browse files
authored
Merge pull request diesel-rs#904 from Eijebong/chrono_sqlite
Correctly infer datetime types for SQLite
2 parents e2608a4 + 1171ca3 commit e7ec7a1

4 files changed

Lines changed: 57 additions & 9 deletions

File tree

diesel_infer_schema/src/sqlite.rs

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -85,25 +85,36 @@ pub fn get_primary_keys(conn: &SqliteConnection, table: &TableData) -> QueryResu
8585
.collect())
8686
}
8787

88+
fn diesel_type(t: &str) -> Vec<String> {
89+
vec!["diesel".into(), "types".into(), t.into()]
90+
}
91+
8892
pub fn determine_column_type(attr: &ColumnInformation) -> Result<ColumnType, Box<Error>> {
8993
let type_name = attr.type_name.to_lowercase();
9094
let path = if is_bool(&type_name) {
91-
vec!["diesel".into(), "types".into(), "Bool".into()]
95+
diesel_type("Bool")
9296
} else if is_smallint(&type_name) {
93-
vec!["diesel".into(), "types".into(), "SmallInt".into()]
97+
diesel_type("SmallInt")
9498
} else if is_bigint(&type_name) {
95-
vec!["diesel".into(), "types".into(), "BigInt".into()]
99+
diesel_type("BigInt")
96100
} else if type_name.contains("int") {
97-
vec!["diesel".into(), "types".into(), "Integer".into()]
101+
diesel_type("Integer")
98102
} else if is_text(&type_name) {
99-
vec!["diesel".into(), "types".into(), "Text".into()]
103+
diesel_type("Text")
100104
} else if type_name.contains("blob") || type_name.is_empty() {
101-
vec!["diesel".into(), "types".into(), "Binary".into()]
105+
diesel_type("Binary")
102106
} else if is_float(&type_name) {
103-
vec!["diesel".into(), "types".into(), "Float".into()]
107+
diesel_type("Float")
104108
} else if is_double(&type_name) {
105-
vec!["diesel".into(), "types".into(), "Double".into()]
106-
} else {
109+
diesel_type("Double")
110+
} else if type_name == "datetime" || type_name == "timestamp" {
111+
diesel_type("Timestamp")
112+
} else if type_name == "date" {
113+
diesel_type("Date")
114+
} else if type_name == "time" {
115+
diesel_type("Time")
116+
}
117+
else {
107118
return Err(format!("Unsupported type: {}", type_name).into())
108119
};
109120

diesel_tests/tests/schema_inference.rs

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
1+
extern crate chrono;
2+
13
#[cfg(feature = "sqlite")]
24
mod sqlite {
35
use diesel::*;
46
use schema::*;
7+
use super::chrono::*;
58

69
#[derive(Queryable, PartialEq, Debug, Insertable)]
710
#[table_name="infer_all_the_ints"]
@@ -132,4 +135,31 @@ mod sqlite {
132135

133136
assert_eq!(Ok(vec![inferred_floats]), infer_all_the_floats::table.load(&conn));
134137
}
138+
139+
#[derive(Queryable, PartialEq, Debug, Insertable)]
140+
#[table_name="infer_all_the_datetime_types"]
141+
struct InferredDatetimeTypes {
142+
dt: NaiveDateTime,
143+
date: NaiveDate,
144+
time: NaiveTime,
145+
timestamp: NaiveDateTime,
146+
}
147+
148+
#[test]
149+
fn datetime_types_are_correctly_inferred() {
150+
let conn = connection();
151+
152+
let dt = NaiveDate::from_ymd(2016, 7, 8).and_hms(9, 10, 11);
153+
let inferred_datetime_types = InferredDatetimeTypes {
154+
dt: dt,
155+
date: dt.date(),
156+
time: dt.time(),
157+
timestamp: dt,
158+
};
159+
160+
insert(&inferred_datetime_types).into(infer_all_the_datetime_types::table)
161+
.execute(&conn).unwrap();
162+
163+
assert_eq!(Ok(vec![inferred_datetime_types]), infer_all_the_datetime_types::table.load(&conn));
164+
}
135165
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
DROP TABLE infer_all_the_datetime_types;
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
CREATE TABLE infer_all_the_datetime_types (
2+
dt DATETIME PRIMARY KEY NOT NULL,
3+
date DATE NOT NULL,
4+
time TIME NOT NULL,
5+
timestamp TIMESTAMP NOT NULL
6+
);

0 commit comments

Comments
 (0)