Skip to content

Instantly share code, notes, and snippets.

@moatorres
Last active March 19, 2022 18:33
Show Gist options
  • Save moatorres/c224ff5d3538c9c41559095480e7560d to your computer and use it in GitHub Desktop.
Save moatorres/c224ff5d3538c9c41559095480e7560d to your computer and use it in GitHub Desktop.
Sequelize + Typescript Setup
module.exports = (sequelize: any, DataTypes: any) => {
const Member = sequelize.define(
'member',
{
id: {
type: DataTypes.UUID,
defaultValue: DataTypes.UUIDV4,
allowNull: false,
primaryKey: true,
},
user_id: {
type: DataTypes.UUID,
allowNull: false,
primaryKey: true,
references: {
model: 'user',
key: 'id',
},
onDelete: 'cascade',
onUpdate: 'cascade',
},
reputation: {
type: DataTypes.INTEGER,
allowNull: false,
defaultValue: 0,
},
},
{
timestamps: true,
underscored: true,
tableName: 'member',
}
)
Member.associate = (models: any) => {
Member.belongsTo(models.User, {
foreignKey: 'user_id',
targetKey: 'id',
as: 'User',
})
}
return Member
}
import fs from 'fs'
import path from 'path'
import Sequelize from 'sequelize'
import { sequelize } from './config.js'
// current file basename
const basename = path.basename(__filename)
// our db object
const db: any = {}
// so we don't reload unecessarily
let loaded = false
const createModels = () => {
// if already loaded, return cached object
if (loaded) return db
// create an array of model files' basenames
const filenames = fs.readdirSync(__dirname).filter((file: string) => {
return (
// filter out the current `index.ts` file
file.indexOf('.') !== 0 && file !== basename && file.slice(-3) === '.ts'
)
})
filenames.map((file: any) => {
// use `require` to load our models
const model = require(path.join(__dirname, file))(
sequelize,
Sequelize.DataTypes
)
db[model.name] = model
})
// run `.associate` if applicable
Object.keys(db).map((model) => {
if (db[model].associate) {
db[model].associate(db)
}
})
// attach both our instance and Sequelize to our db object
db.sequelize = sequelize
db.Sequelize = Sequelize
loaded = true
return db
}
export default createModels()
export { createModels }
import { Sequelize } from 'sequelize'
const dbName = 'test-db'
const dbUser = 'test-user'
const dbPass = '123123'
const dbHost = 'some-host'
export const sequelize = new Sequelize(dbName, dbUser, dbPass, {
host: dbHost,
dialect: 'postgres',
port: 3306,
dialectOptions: {
multipleStatements: true,
},
pool: {
max: 5,
min: 0,
idle: 10000,
},
logging: false,
})
module.exports = (sequelize: any, DataTypes: any) => {
const User = sequelize.define(
'user',
{
id: {
type: DataTypes.UUID,
defaultValue: DataTypes.UUIDV4,
allowNull: false,
primaryKey: true,
},
email: {
type: DataTypes.STRING(250),
allowNull: false,
unique: true,
},
password: {
type: DataTypes.STRING,
allowNull: true,
defaultValue: null,
},
},
{
timestamps: true,
underscored: true,
tableName: 'user',
indexes: [{ unique: true, fields: ['email'] }],
}
)
User.associate = (models: any) => {
User.hasOne(models.Member, { as: 'Member', foreignKey: 'id' })
}
return User
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment