Use Not(IsNull())
This commit is contained in:
syuilo 2019-05-20 21:44:16 +09:00
parent e3d880b8be
commit 02511b837f
7 changed files with 27 additions and 13 deletions

View file

@ -128,6 +128,20 @@ query.andWhere(new Brackets(qb => {
})); }));
``` ```
### Not `null` in TypeORM
```ts
const foo = await Foos.findOne({
bar: Not(null)
});
```
のようなクエリ(`bar`が`null`ではない)は期待通りに動作しない。
次のようにします:
```ts
const foo = await Foos.findOne({
bar: Not(IsNull())
});
```
### `null` in SQL ### `null` in SQL
SQLを発行する際、パラメータが`null`になる可能性のある場合はSQL文を出し分けなければならない SQLを発行する際、パラメータが`null`になる可能性のある場合はSQL文を出し分けなければならない
例えば 例えば

View file

@ -4,7 +4,7 @@ import define from '../../define';
import { maximum } from '../../../../prelude/array'; import { maximum } from '../../../../prelude/array';
import { ApiError } from '../../error'; import { ApiError } from '../../error';
import { getUser } from '../../common/getters'; import { getUser } from '../../common/getters';
import { Not, In } from 'typeorm'; import { Not, In, IsNull } from 'typeorm';
import { Notes, Users } from '../../../../models'; import { Notes, Users } from '../../../../models';
import { types, bool } from '../../../../misc/schema'; import { types, bool } from '../../../../misc/schema';
@ -58,7 +58,7 @@ export default define(meta, async (ps, me) => {
const recentNotes = await Notes.find({ const recentNotes = await Notes.find({
where: { where: {
userId: user.id, userId: user.id,
replyId: Not(null) replyId: Not(IsNull())
}, },
order: { order: {
id: -1 id: -1

View file

@ -2,7 +2,7 @@ import autobind from 'autobind-decorator';
import Chart, { Obj, DeepPartial } from '../../core'; import Chart, { Obj, DeepPartial } from '../../core';
import { SchemaType } from '../../../../misc/schema'; import { SchemaType } from '../../../../misc/schema';
import { DriveFiles } from '../../../../models'; import { DriveFiles } from '../../../../models';
import { Not } from 'typeorm'; import { Not, IsNull } from 'typeorm';
import { DriveFile } from '../../../../models/entities/drive-file'; import { DriveFile } from '../../../../models/entities/drive-file';
import { name, schema } from '../schemas/drive'; import { name, schema } from '../schemas/drive';
@ -31,7 +31,7 @@ export default class DriveChart extends Chart<DriveLog> {
protected async fetchActual(): Promise<DeepPartial<DriveLog>> { protected async fetchActual(): Promise<DeepPartial<DriveLog>> {
const [localCount, remoteCount, localSize, remoteSize] = await Promise.all([ const [localCount, remoteCount, localSize, remoteSize] = await Promise.all([
DriveFiles.count({ userHost: null }), DriveFiles.count({ userHost: null }),
DriveFiles.count({ userHost: Not(null) }), DriveFiles.count({ userHost: Not(IsNull()) }),
DriveFiles.clacDriveUsageOfLocal(), DriveFiles.clacDriveUsageOfLocal(),
DriveFiles.clacDriveUsageOfRemote() DriveFiles.clacDriveUsageOfRemote()
]); ]);

View file

@ -2,7 +2,7 @@ import autobind from 'autobind-decorator';
import Chart, { Obj, DeepPartial } from '../../core'; import Chart, { Obj, DeepPartial } from '../../core';
import { SchemaType } from '../../../../misc/schema'; import { SchemaType } from '../../../../misc/schema';
import { Notes } from '../../../../models'; import { Notes } from '../../../../models';
import { Not } from 'typeorm'; import { Not, IsNull } from 'typeorm';
import { Note } from '../../../../models/entities/note'; import { Note } from '../../../../models/entities/note';
import { name, schema } from '../schemas/notes'; import { name, schema } from '../schemas/notes';
@ -29,7 +29,7 @@ export default class NotesChart extends Chart<NotesLog> {
protected async fetchActual(): Promise<DeepPartial<NotesLog>> { protected async fetchActual(): Promise<DeepPartial<NotesLog>> {
const [localCount, remoteCount] = await Promise.all([ const [localCount, remoteCount] = await Promise.all([
Notes.count({ userHost: null }), Notes.count({ userHost: null }),
Notes.count({ userHost: Not(null) }) Notes.count({ userHost: Not(IsNull()) })
]); ]);
return { return {

View file

@ -2,7 +2,7 @@ import autobind from 'autobind-decorator';
import Chart, { Obj, DeepPartial } from '../../core'; import Chart, { Obj, DeepPartial } from '../../core';
import { SchemaType } from '../../../../misc/schema'; import { SchemaType } from '../../../../misc/schema';
import { Followings, Users } from '../../../../models'; import { Followings, Users } from '../../../../models';
import { Not } from 'typeorm'; import { Not, IsNull } from 'typeorm';
import { User } from '../../../../models/entities/user'; import { User } from '../../../../models/entities/user';
import { name, schema } from '../schemas/per-user-following'; import { name, schema } from '../schemas/per-user-following';
@ -45,8 +45,8 @@ export default class PerUserFollowingChart extends Chart<PerUserFollowingLog> {
] = await Promise.all([ ] = await Promise.all([
Followings.count({ followerId: group, followeeHost: null }), Followings.count({ followerId: group, followeeHost: null }),
Followings.count({ followeeId: group, followerHost: null }), Followings.count({ followeeId: group, followerHost: null }),
Followings.count({ followerId: group, followeeHost: Not(null) }), Followings.count({ followerId: group, followeeHost: Not(IsNull()) }),
Followings.count({ followeeId: group, followerHost: Not(null) }) Followings.count({ followeeId: group, followerHost: Not(IsNull()) })
]); ]);
return { return {

View file

@ -2,7 +2,7 @@ import autobind from 'autobind-decorator';
import Chart, { Obj, DeepPartial } from '../../core'; import Chart, { Obj, DeepPartial } from '../../core';
import { SchemaType } from '../../../../misc/schema'; import { SchemaType } from '../../../../misc/schema';
import { Users } from '../../../../models'; import { Users } from '../../../../models';
import { Not } from 'typeorm'; import { Not, IsNull } from 'typeorm';
import { User } from '../../../../models/entities/user'; import { User } from '../../../../models/entities/user';
import { name, schema } from '../schemas/users'; import { name, schema } from '../schemas/users';
@ -29,7 +29,7 @@ export default class UsersChart extends Chart<UsersLog> {
protected async fetchActual(): Promise<DeepPartial<UsersLog>> { protected async fetchActual(): Promise<DeepPartial<UsersLog>> {
const [localCount, remoteCount] = await Promise.all([ const [localCount, remoteCount] = await Promise.all([
Users.count({ host: null }), Users.count({ host: null }),
Users.count({ host: Not(null) }) Users.count({ host: Not(IsNull()) })
]); ]);
return { return {

View file

@ -1,14 +1,14 @@
import * as promiseLimit from 'promise-limit'; import * as promiseLimit from 'promise-limit';
import del from '../services/drive/delete-file'; import del from '../services/drive/delete-file';
import { DriveFiles } from '../models'; import { DriveFiles } from '../models';
import { Not } from 'typeorm'; import { Not, IsNull } from 'typeorm';
import { DriveFile } from '../models/entities/drive-file'; import { DriveFile } from '../models/entities/drive-file';
import { ensure } from '../prelude/ensure'; import { ensure } from '../prelude/ensure';
const limit = promiseLimit(16); const limit = promiseLimit(16);
DriveFiles.find({ DriveFiles.find({
userHost: Not(null) userHost: Not(IsNull())
}).then(async files => { }).then(async files => {
console.log(`there is ${files.length} files`); console.log(`there is ${files.length} files`);