support for more(all?) column types in Postgres

This commit is contained in:
Kononnable 2017-11-20 22:23:00 +01:00
parent 298c3bc415
commit 4e5393d00e
4 changed files with 341 additions and 33 deletions

View File

@ -23,7 +23,7 @@ export class PostgresDriver extends AbstractDriver {
});
}
async GetAllTables(schema:string): Promise<EntityInfo[]> {
async GetAllTables(schema: string): Promise<EntityInfo[]> {
let response: { table_schema: string, table_name: string }[]
= (await this.Connection.query(`SELECT table_schema,table_name FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE='BASE TABLE' AND table_schema = '${schema}' `)).rows;
@ -38,7 +38,7 @@ export class PostgresDriver extends AbstractDriver {
})
return ret;
}
async GetCoulmnsFromEntity(entities: EntityInfo[],schema:string): Promise<EntityInfo[]> {
async GetCoulmnsFromEntity(entities: EntityInfo[], schema: string): Promise<EntityInfo[]> {
let response: {
table_name: string, column_name: string, column_default: string,
is_nullable: string, data_type: string, character_maximum_length: number,
@ -59,16 +59,14 @@ export class PostgresDriver extends AbstractDriver {
colInfo.is_generated = resp.isidentity == 'YES' ? true : false;
colInfo.default = colInfo.is_generated ? '' : resp.column_default;
switch (resp.data_type) {
//TODO:change types to postgres
case "integer":
colInfo.ts_type = "number"
colInfo.sql_type = "int"
colInfo.char_max_lenght = resp.character_maximum_length > 0 ? resp.character_maximum_length: null;
break;
case "character varying":
colInfo.ts_type = "string"
colInfo.sql_type = "character varying"
colInfo.char_max_lenght = resp.character_maximum_length > 0 ? resp.character_maximum_length: null;
colInfo.char_max_lenght = resp.character_maximum_length > 0 ? resp.character_maximum_length : null;
break;
case "text":
colInfo.ts_type = "string"
@ -81,15 +79,13 @@ export class PostgresDriver extends AbstractDriver {
case "smallint":
colInfo.ts_type = "number"
colInfo.sql_type = "smallint"
colInfo.char_max_lenght = resp.character_maximum_length > 0 ? resp.character_maximum_length: null;
break;
case "bigint":
colInfo.ts_type = "number"
colInfo.ts_type = "string"
colInfo.sql_type = "bigint"
colInfo.char_max_lenght = resp.character_maximum_length > 0 ? resp.character_maximum_length: null;
break;
case "date":
colInfo.ts_type = "Date"
colInfo.ts_type = "string"
colInfo.sql_type = "date"
break;
case "boolean":
@ -99,21 +95,24 @@ export class PostgresDriver extends AbstractDriver {
case "double precision":
colInfo.ts_type = "number"
colInfo.sql_type = "double"
colInfo.char_max_lenght = resp.character_maximum_length > 0 ? resp.character_maximum_length: null;
colInfo.numericPrecision = resp.numeric_precision
colInfo.numericScale = resp.numeric_scale
break;
case "real":
colInfo.ts_type = "number"
colInfo.sql_type = "float"
colInfo.char_max_lenght = resp.character_maximum_length > 0 ? resp.character_maximum_length: null;
colInfo.numericPrecision = resp.numeric_precision
colInfo.numericScale = resp.numeric_scale
break;
case "numeric":
colInfo.ts_type = "number"
colInfo.sql_type = "decimal"
colInfo.char_max_lenght = resp.character_maximum_length > 0 ? resp.character_maximum_length: null;
colInfo.ts_type = "string"
colInfo.sql_type = "numeric"
colInfo.numericPrecision = resp.numeric_precision
colInfo.numericScale = resp.numeric_scale
break;
case "time without time zone":
colInfo.ts_type = "Date"
colInfo.sql_type = "time"
colInfo.ts_type = "string"
colInfo.sql_type = "time without time zone"
break;
case "timestamp without time zone":
colInfo.ts_type = "Date"
@ -124,17 +123,86 @@ export class PostgresDriver extends AbstractDriver {
colInfo.sql_type = "timestamp"
break;
case "json":
colInfo.ts_type = "any"
colInfo.ts_type = "Object"
colInfo.sql_type = "json"
break;
case "jsonb":
colInfo.ts_type = "any"
colInfo.ts_type = "Object"
colInfo.sql_type = "jsonb"
break;
// case "boolean":
// colInfo.ts_type = "boolean"
// colInfo.sql_type = "boolean"
// break;
case "money":
colInfo.ts_type = "string"
colInfo.sql_type = "money"
break;
case "character":
colInfo.ts_type = "string"
colInfo.sql_type = "character"
colInfo.char_max_lenght = resp.character_maximum_length > 0 ? resp.character_maximum_length : null;
break;
case "bytea":
colInfo.ts_type = "Buffer"
colInfo.sql_type = "bytea"
break;
case "interval":
colInfo.ts_type = "any"
colInfo.sql_type = "interval"
break;
case "time with time zone":
colInfo.ts_type = "string"
colInfo.sql_type = "time with time zone"
break;
case "point":
colInfo.ts_type = "string|Object"
colInfo.sql_type = "point"
break;
case "line":
colInfo.ts_type = "string"
colInfo.sql_type = "line"
break;
case "lseg":
colInfo.ts_type = "string|string[]"
colInfo.sql_type = "lseg"
break;
case "box":
colInfo.ts_type = "string|Object"
colInfo.sql_type = "box"
break;
case "path":
colInfo.ts_type = "string"
colInfo.sql_type = "path"
break;
case "polygon":
colInfo.ts_type = "string"
colInfo.sql_type = "polygon"
break;
case "circle":
colInfo.ts_type = "string|Object"
colInfo.sql_type = "circle"
break;
case "cidr":
colInfo.ts_type = "string"
colInfo.sql_type = "cidr"
break;
case "inet":
colInfo.ts_type = "string"
colInfo.sql_type = "inet"
break;
case "macaddr":
colInfo.ts_type = "string"
colInfo.sql_type = "macaddr"
break;
case "bit":
colInfo.ts_type = "string"
colInfo.sql_type = "bit"
break;
case "bit varying":
colInfo.ts_type = "string"
colInfo.sql_type = "bit varying"
break;
case "xml":
colInfo.ts_type = "string"
colInfo.sql_type = "xml"
break;
default:
console.error("Unknown column type:" + resp.data_type);
@ -146,7 +214,7 @@ export class PostgresDriver extends AbstractDriver {
})
return entities;
}
async GetIndexesFromEntity(entities: EntityInfo[],schema:string): Promise<EntityInfo[]> {
async GetIndexesFromEntity(entities: EntityInfo[], schema: string): Promise<EntityInfo[]> {
let response: {
tablename: string, indexname: string, columnname: string, is_unique: number,
is_primary_key: number//, is_descending_key: number//, is_included_column: number
@ -211,7 +279,7 @@ export class PostgresDriver extends AbstractDriver {
return entities;
}
async GetRelations(entities: EntityInfo[],schema:string): Promise<EntityInfo[]> {
async GetRelations(entities: EntityInfo[], schema: string): Promise<EntityInfo[]> {
let response: {
tablewithforeignkey: string, fk_partno: number, foreignkeycolumn: string,
tablereferenced: string, foreignkeycolumnreferenced: string,
@ -383,14 +451,14 @@ export class PostgresDriver extends AbstractDriver {
}
}
async ConnectToServer(database: string, server: string, port: number, user: string, password: string,ssl:boolean) {
async ConnectToServer(database: string, server: string, port: number, user: string, password: string, ssl: boolean) {
this.Connection = new PG.Client({
database: database,
host: server,
port: port,
user: user,
password: password,
ssl:ssl
ssl: ssl
})

View File

@ -7,7 +7,7 @@ export class ColumnInfo {
name: string = '';
default: string | null = null;
is_nullable: boolean = false;
ts_type: 'number' | 'string' | 'boolean' | 'Date' | 'Buffer' | 'any';
ts_type: 'number' | 'string' | 'boolean' | 'Date' | 'Buffer' | 'Object' | 'string|Object' | 'string|string[]' | 'any';
sql_type: ColumnType;
char_max_lenght: number | null = null;
isPrimary: boolean = false;

View File

@ -0,0 +1,240 @@
import { Entity, PrimaryColumn, Column } from "typeorm";
@Entity("Post")
export class Post {
@PrimaryColumn()
id: number;
@Column()
name: string;
// -------------------------------------------------------------------------
// Numeric Types
// -------------------------------------------------------------------------
@Column("integer")
integer: number;
@Column("int4")
int4: number;
@Column("int")
int: number;
@Column("smallint")
smallint: number;
@Column("int2")
int2: number;
@Column("bigint")
bigint: string;
@Column("int8")
int8: string;
// @Column("serial")
// serial: number;
// @Column("serial4")
// serial4: number;
// @Column("smallserial")
// smallserial: number;
// @Column("serial2")
// serial2: number;
// @Column("bigserial")
// bigserial: number;
// @Column("serial8")
// serial8: number;
@Column("numeric")
numeric: string;
@Column("decimal")
decimal: string;
@Column("double precision")
doublePrecision: number;
@Column("float8")
float8: number;
@Column("real")
real: number;
@Column("float4")
float4: number;
// -------------------------------------------------------------------------
// Monetary Types
// -------------------------------------------------------------------------
@Column("money")
money: string;
// -------------------------------------------------------------------------
// Character Types
// -------------------------------------------------------------------------
@Column("char")
char: string;
@Column("character")
character: string;
@Column("varchar")
varchar: string;
@Column("character varying")
characterVarying: string;
@Column("text")
text: string;
// @Column("citext")
// citext: string;
// -------------------------------------------------------------------------
// Binary Data Types
// -------------------------------------------------------------------------
@Column("bytea")
bytea: Buffer;
// -------------------------------------------------------------------------
// Date/Time Types
// -------------------------------------------------------------------------
@Column("date")
date: string;
@Column("interval")
interval: any;
@Column("time")
time: string;
@Column("time with time zone")
timeWithTimeZone: string;
@Column("timetz")
timetz: string;
@Column("timestamp")
timestamp: Date;
@Column("timestamp with time zone")
timestampWithTimeZone: Date;
@Column("timestamptz")
timestamptz: Date;
// -------------------------------------------------------------------------
// Boolean Type
// -------------------------------------------------------------------------
@Column("boolean")
boolean: boolean;
@Column("bool")
bool: boolean;
// -------------------------------------------------------------------------
// Enumerated Type
// -------------------------------------------------------------------------
// @Column("enum", { enum: ["A", "B", "C"] })
// enum: string;
// -------------------------------------------------------------------------
// Geometric Type
// -------------------------------------------------------------------------
@Column("point")
point: string | Object;
@Column("line")
line: string;
@Column("lseg")
lseg: string | string[];
@Column("box")
box: string | Object;
@Column("path")
path: string;
@Column("polygon")
polygon: string;
@Column("circle")
circle: string | Object;
// -------------------------------------------------------------------------
// Network Address Type
// -------------------------------------------------------------------------
@Column("cidr")
cidr: string;
@Column("inet")
inet: string;
@Column("macaddr")
macaddr: string;
// -------------------------------------------------------------------------
// Bit String Type
// -------------------------------------------------------------------------
@Column("bit")
bit: string;
@Column("varbit")
varbit: string;
@Column("bit varying")
bitVarying: string;
// -------------------------------------------------------------------------
// UUID Type
// -------------------------------------------------------------------------
@Column("uuid")
uuid: string;
// -------------------------------------------------------------------------
// XML Type
// -------------------------------------------------------------------------
@Column("xml")
xml: string;
// -------------------------------------------------------------------------
// JSON Type
// -------------------------------------------------------------------------
@Column("json")
json: Object;
// -------------------------------------------------------------------------
// Array Type
// -------------------------------------------------------------------------
// @Column("int", { isArray: true })
// array: number[];
// // -------------------------------------------------------------------------
// // TypeOrm Specific Type
// // -------------------------------------------------------------------------
// @Column("simple-array")
// simpleArray: string[];
}

View File

@ -36,17 +36,17 @@ export class EverythingEntity {
// @Column("double")
// doubleColumn: number;
@Column("decimal")
decimalColumn: number;
// @Column("decimal")
// decimalColumn: number;
@Column()
date: Date;
@Column("date")
dateColumn: Date;
// @Column("date")
// dateColumn: Date;
@Column("time")
timeColumn: Date;
// @Column("time")
// timeColumn: Date;
// @Column("boolean")
// isBooleanColumn: boolean;