sqlite - 迁移未使用 Capacitor 在 Ionic 和 Vue 上的 TypeORM 上注册
问题描述
我正在使用电容器-sqlite 插件创建一个 Ionic5 应用程序(使用 Vue3) 。我也试图在这一切之上使用 TypeORM。
我可以使用电容器连接到 sqlite 数据库,但由于某种原因,迁移似乎根本没有被注册,并且总是以带有以下代码的空数组出现:
// App.vue
import {createConnection} from "typeorm";
import {CapacitorSQLite, SQLiteConnection} from "@capacitor-community/sqlite";
onBeforeMount(async () => {
const sqlite = new SQLiteConnection(CapacitorSQLite);
createConnection({
type: 'capacitor',
driver: sqlite,
database: 'mydrivetime',
synchronize: false,
migrationsRun: false,
logging: true,
entities: [
"User"
],
migrations: [
"1626771964722-UserCreate"
],
}).then(async connection => {
console.log('migrations', connection.migrations);
console.log('isConnected', connection.isConnected);
connection.runMigrations()
.then(() => {
console.log("migrations successful");
}).catch(error => console.log(JSON.stringify(error)));
});
});
即使我在同一路径上进行了迁移设置,我也会得到以下输出:
⚡️ [log] - migrations []
⚡️ [log] - isConnected true
⚡️ [log] - migrations successful
这是我在同一路径中的迁移文件App.vue
。我还尝试将它放在一个单独的文件夹中并尝试将其全局化,但没有运气。
import {MigrationInterface, QueryRunner} from "typeorm";
export class UserCreate1626771964722 implements MigrationInterface {
public async up(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(`
CREATE TABLE "user" (
"id" integer PRIMARY KEY AUTOINCREMENT NOT NULL,
"firstName" varchar NOT NULL,
"age" integer NOT NULL
)
`);
}
public async down(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(`
DROP TABLE "user"
`);
}
}
我在其他任何地方都没有任何其他设置,我不确定为什么迁移(或实体)没有注册。这是对象的完整console.log
内容connection
:
{
"migrations": [],
"subscribers": [],
"entityMetadatas": [],
"name": "default",
"options": {
"type": "capacitor",
"driver": {
"sqlite": {},
"_connectionDict": {}
},
"database": "mydrivetime",
"synchronize": false,
"migrationsRun": false,
"logging": true,
"entities": [
"User"
],
"migrations": [
"1626771964722-UserCreate"
]
},
"logger": {
"options": true
},
"driver": {
"isReplicated": false,
"treeSupport": true,
"supportedDataTypes": [
"int",
"integer",
"tinyint",
"smallint",
"mediumint",
"bigint",
"unsigned big int",
"int2",
"int8",
"integer",
"character",
"varchar",
"varying character",
"nchar",
"native character",
"nvarchar",
"text",
"clob",
"text",
"blob",
"real",
"double",
"double precision",
"float",
"real",
"numeric",
"decimal",
"boolean",
"date",
"time",
"datetime"
],
"withLengthColumnTypes": [
"character",
"varchar",
"varying character",
"nchar",
"native character",
"nvarchar",
"text",
"blob",
"clob"
],
"spatialTypes": [],
"withPrecisionColumnTypes": [
"real",
"double",
"double precision",
"float",
"real",
"numeric",
"decimal",
"date",
"time",
"datetime"
],
"withScaleColumnTypes": [
"real",
"double",
"double precision",
"float",
"real",
"numeric",
"decimal"
],
"mappedDataTypes": {
"createDate": "datetime",
"createDateDefault": "datetime('now')",
"updateDate": "datetime",
"updateDateDefault": "datetime('now')",
"deleteDate": "datetime",
"deleteDateNullable": true,
"version": "integer",
"treeLevel": "integer",
"migrationId": "integer",
"migrationName": "varchar",
"migrationTimestamp": "bigint",
"cacheId": "int",
"cacheIdentifier": "varchar",
"cacheTime": "bigint",
"cacheDuration": "int",
"cacheQuery": "text",
"cacheResult": "text",
"metadataType": "varchar",
"metadataDatabase": "varchar",
"metadataSchema": "varchar",
"metadataTable": "varchar",
"metadataName": "varchar",
"metadataValue": "text"
},
"connection": "...",
"options": "...",
"database": "mydrivetime",
"driver": "...",
"sqlite": "...",
"databaseConnection": {}
},
"manager": {
"repositories": [],
"plainObjectToEntityTransformer": {},
"connection": "..."
},
"namingStrategy": {
"nestedSetColumnNames": {
"left": "nsleft",
"right": "nsright"
},
"materializedPathColumnName": "mpath"
},
"relationLoader": {
"connection": "..."
},
"relationIdLoader": {
"connection": "..."
},
"isConnected": true
}
解决方案
事实证明,这个问题是一个众所周知的问题,TypeORM 实体/迁移在缩小时不起作用。修复方法是添加 vue 配置以防止类名被缩小,如下所示:
//vue.config.js (in the root folder)
module.exports = {
chainWebpack: config => {
if (process.env.NODE_ENV === 'production') {
config.optimization.minimizer('terser').tap((args) => {
// see https://cli.vuejs.org/guide/webpack.html#chaining-advanced
// https://cli.vuejs.org/migrating-from-v3/#vue-cli-service
// => chainWebpack for a chain override example
// https://github.com/terser/terser#minify-options for terser options
const terserOptions = args[0].terserOptions
// Avoid to mangle entities (leads to query errors)
terserOptions["keep_classnames"] = true
terserOptions["keep_fnames"] = true
// console.log(JSON.stringify(args[0], null, 2))
return args
})
}
},
// ...rest of your vue.config.js...
}
有关更多信息,请查看此 github 问题
推荐阅读
- asp.net - 无法在 Azure 中编辑或删除 .svc。找不到错误 404
- r - 从 R 中的一组局部最大值中获取真正的最大值
- jwt - Keycloak权限信息产品ID
- angular - 将 Spotify 曲目添加到播放列表会返回 401
- reactjs - 在 React 中将 props 传递给组件
- html - 你如何在 Vue 中使用 input type="image"?
- r - r- 使用 sum 和 match 查找高频的第一次出现
- json - 将对象转换为键值对数组
- python - 如何删除通过 pyenv/pip 安装的包
- sas - PROC SGPLOT中curvelabelpos和xaxis的SAS问题