Vai al contenuto principale

Note di rilascio di TypeORM 1.0

Traduzione Beta Non Ufficiale

Questa pagina è stata tradotta da PageTurner AI (beta). Non ufficialmente approvata dal progetto. Hai trovato un errore? Segnala problema →

TypeORM 1.0 è una release importante che rimuove API deprecate da tempo, modernizza i requisiti di piattaforma e include decine di correzioni di bug e nuove funzionalità accumulate durante il ciclo 0.3.x.

Modifiche incompatibili

Consulta la Guida alla migrazione per istruzioni dettagliate sull'aggiornamento.

Requisiti di piattaforma

  • Node.js 20+ obbligatorio — il supporto per Node.js 16 e 18 è stato rimosso e il target JavaScript minimo è ora ES2023 (#11382 di @alumni)

  • Polyfill Buffer rimosso — ora viene utilizzato Uint8Array per i dati binari su piattaforme non Node; Buffer di Node.js (che estende Uint8Array) continua a funzionare come prima (#11935 di @pujux)

  • Libreria Glob sostituitaglob è stato sostituito con tinyglobby e rimraf è stato rimosso, riducendo le dipendenze (#11699 di @alumni)

  • Hashing spostato su crypto nativo — i pacchetti sha.js e uuid sono stati sostituiti con il modulo nativo crypto e crypto.randomUUID() (#11864 di @G0maa, #11769 di @mag123c)

Modifiche ai driver

  • MySQL / MariaDB: pacchetto mysql rimosso — è supportato solo mysql2; l'opzione connectorPackage è stata eliminata (#11766 di @pkuczynski)

  • MySQL: legacySpatialSupport ora è false di default — vengono usate per impostazione predefinita le funzioni standard ST_GeomFromText/ST_AsText (#12083 di @pkuczynski)

  • MySQL: opzioni colonna width e zerofill rimosse — deprecate in MySQL 8.0.17 e rimosse in MySQL 8.4 (#12084 di @pkuczynski)

  • SQLite: sqlite3 rimosso, better-sqlite3 è il default — il pacchetto sqlite3 non è più supportato; le opzioni flags e busyTimeout sono state rimosse (#11836 di @pkuczynski)

  • MongoDB: driver v7+ obbligatorio — il supporto per MongoDB Node.js driver v5/v6 è stato rimosso; metodo stats() eliminato; opzioni di connessione deprecate rimosse; i tipi interni non sono più esportati (#12208 di @naorpeled, #12179 di @pkuczynski, #12120 di @pkuczynski, #12037 di @alumni)

  • MS SQL Server: opzione domain rimossa — usa authentication con tipo NTLM al suo posto (#12135 di @pkuczynski)

  • SAP HANA: alias di connessione deprecati rimossihanaClientDriver, pool.max, pool.requestTimeout, pool.idleTimeout e altri sono stati rimossi a favore delle loro controparti moderne (#12080 di @gioboa)

  • Expo: driver legacy rimosso — il vecchio driver SQLite per Expo è stato rimosso; usa Expo SDK v52+ con la moderna API asincrona (#11860 di @G0maa)

  • Redis: supporto client legacy rimosso — è supportato solo il client Redis moderno (v4+) per la cache dei risultati delle query (#12057 di @G0maa)

API rimosse

  • Connection e ConnectionOptions rimossi — usa DataSource e DataSourceOptions al loro posto (#12022 di @alumni)

  • ConnectionManager e funzioni globali rimossecreateConnection, getConnection, getManager, getRepository, createQueryBuilder e altre funzioni globali sono state rimosse (#12098 di @michaelbromley)

  • Funzioni globali getMongoRepository e getMongoManager rimosse — usa dataSource.getMongoRepository() e dataSource.mongoManager al loro posto (#12099 di @pkuczynski)

  • DataSource.name rimosso — le connessioni nominate erano deprecate in v0.3; ConnectionOptionsReader.all() rinominato in get() (#12136 di @pkuczynski)

  • Supporto variabili d'ambiente TYPEORM_* rimossoConnectionOptionsEnvReader, ormconfig.env e il caricamento automatico di dotenv sono stati rimossi (#12134 di @pkuczynski)

  • findByIds rimosso — usa findBy con l'operatore In al suo posto (#12114 di @pkuczynski)

  • Repository.exist() rimosso — usa Repository.exists() al suo posto (#12131 di @pkuczynski)

  • AbstractRepository, @EntityRepository e getCustomRepository rimossi — usa Repository.extend() al loro posto (#12096 di @pkuczynski)

  • Decoratore @RelationCount rimosso — usa @VirtualColumn con una sotto-query al suo posto (#12181 di @pkuczynski)

  • Rimosso il sistema di container IoCuseContainer(), getFromContainer() e i tipi correlati sono stati rimossi (#12180 by @pkuczynski)

  • Rimossa l'opzione di colonna readonly — usa invece update: false (#12132 by @pkuczynski)

  • Rimosso unsigned da ColumnNumericOptions — riguarda solo i tipi decimali/float; unsigned per gli integer rimane invariato (#12133 by @pkuczynski)

  • QueryBuilder: rimossi onConflict(), l'overload deprecato di orUpdate() e setNativeParameters() — usa invece orIgnore()/orUpdate() con firma ad array e setParameters() (#12090 by @pkuczynski)

  • QueryBuilder: printSql() rinominato in logQuery() (#12151 by @naorpeled)

  • QueryBuilder: rimosso l'alias di tipo WhereExpression — usa invece WhereExpressionBuilder (#12097 by @pkuczynski)

  • QueryBuilder: rimosso replacePropertyNames() — era una no-op (#12178 by @pkuczynski)

  • Rimossi i lock mode deprecatipessimistic_partial_write e pessimistic_write_or_fail sostituiti da pessimistic_write con opzione onLocked (#12093 by @pkuczynski)

  • Rimossi QueryRunner.loadedTables e loadedViews — usa invece getTables() e getViews() (#12183 by @pkuczynski)

  • Rimosso MigrationExecutor.getAllMigrations() — usa invece getPendingMigrations(), getExecutedMigrations() o dataSource.migrations (#12142 by @pkuczynski)

  • Rimossa la funzione statica EntityMetadata.createPropertyPath() — utility interna senza sostituto pubblico (#12141 by @pkuczynski)

  • Rimossa la gestione interna di nativeParameters da driver e query builder (#12104 by @pkuczynski)

  • Rimossa la funzione interna broadcastLoadEventsForAll() da Broadcaster (#12137 by @pkuczynski)

  • Rimossa la funzione interna DriverUtils.buildColumnAlias() — usa invece buildAlias() (#12138 by @pkuczynski)

Modifiche comportamentali

  • invalidWhereValuesBehavior è ora impostato di default su throw — passare null o undefined nelle condizioni where ora genera un errore invece di ignorare silenziosamente la proprietà; usa IsNull() per i match con null (#11710 di @naorpeled)

  • invalidWhereValuesBehavior limitato solo alle API di alto livello — i metodi .where(), .andWhere(), .orWhere() di QueryBuilder non sono più influenzati da questa impostazione (#11878 di @naorpeled)

Nuove funzionalità

Query Builder

  • INSERT INTO ... SELECT FROM ... — nuovo metodo valuesFromSelect() su InsertQueryBuilder per query di migrazione e trasformazione dati (#11896 di @Cprakhar)

  • Opzione returning per update/upsert — i metodi update() e upsert() di repository e entity manager ora supportano l'opzione returning sui database che supportano le clausole RETURNING (#11782 di @naorpeled)

  • Parametro ifExists su tutti i metodi di dropdropColumn, dropIndex, dropPrimaryKey, dropForeignKey, dropUniqueConstraint, dropCheckConstraint, dropExclusionConstraint e le loro varianti plurali ora accettano un flag ifExists (#12121 di @pkuczynski)

  • Gestione esplicita delle risorse per QueryRunner — supporta la sintassi await using (TypeScript 5.2+) per la pulizia automatica (#11701 di @alumni)

Driver

  • PostgreSQL: ADD VALUE per modifiche agli enum — quando aggiunge nuovi valori enum, TypeORM ora usa la sintassi più semplice ALTER TYPE ... ADD VALUE invece dell'approccio in 4 passi (rinomina-crea-migra-elimina), quando possibile (#10956 di @janzipek)

  • PostgreSQL: estensioni aggiuntive — nuova opzione installExtensions per installare estensioni PostgreSQL aggiuntive durante la configurazione della connessione (#11888 di @Cprakhar)

  • PostgreSQL: supporto per indici parziali — aggiunto supporto per gli indici parziali di PostgreSQL (#11318 di @freePixel)

  • SAP HANA: locking nelle SELECTFOR UPDATE e altri tipi di lock sono ora supportati nelle query SAP HANA (#11996 di @alumni)

  • SAP HANA: commenti alle tabelle@Entity({ comment: "..." }) ora funziona con SAP HANA (#11939 di @Cprakhar)

  • SAP HANA: timeout del pool — nuova opzione maxWaitTimeoutIfPoolExhausted per il pool (#11868 di @alumni)

  • SQLite: tipo di colonna jsonb — SQLite ora supporta il tipo di colonna jsonb (#11933 di @Cprakhar)

  • React Native: chiave di crittografia — nuova opzione per passare una chiave di crittografia per database SQLite in React Native (#11736 di @HtSpChakradharCholleti)

Persistenza & Upsert

  • Troncamento a cascata in clear()Repository.clear() e EntityManager.clear() ora accettano { cascade: true } per eseguire TRUNCATE ... CASCADE su PostgreSQL, CockroachDB e Oracle (#11866 di @Cprakhar)

  • Tipizzazione migliorata per increment/decrement — il parametro delle condizioni ora utilizza tipi correttamente allineati all'entità invece di any (#11294 di @OSA413)

Tipi di colonne & Decoratori

  • Supporto deferrabile su @Exclusion — specchia il supporto deferrabile già esistente su @Unique e @Index (#11802 di @oGAD31)

Altro

  • Gestione errori migliorata per ormconfig — i fallimenti nel caricamento ora registrano warning invece di fallire silenziosamente (#11871 di @Cprakhar)

Bug fix

Generazione query

  • Alias di colonna correttamente escapato in orderBy — previene errori SQL quando i nomi alias confliggono con parole riservate (#12027 di @Cprakhar)

  • addOrderBy risolve correttamente i nomi delle colonne — usare il nome della colonna del database (es. created_at) invece del nome della proprietà ora funziona correttamente (#11904 di @smith-xyz)

  • Risoluzione colonne nelle subquery per l'ordinamento — risolto l'errore "Cannot get metadata for given alias" quando si ordinava per colonne di subquery (#11343 di @trannhan0810)

  • Ordinamento colonne preservato in selectgetQuery()/getSql() ora restituisce le colonne nell'ordine aggiunto tramite select() e addSelect() (#11902 di @Cprakhar)

  • Generazione query .update() corretta — risolto bug nella generazione SQL quando si usa .update() in QueryBuilder (#11993 di @gioboa)

  • Generazione SQL upsert con alias di tabella — risolti riferimenti errati alle colonne nelle query upsert con ereditarietà di tabelle e schemi personalizzati (#11915 di @Cprakhar)

  • Limit con join — risolti risultati errati quando si usano paginazione skip/take con join (#11987 di @gioboa)

  • Attributi di join tra parentesi — risolto il parsing dei join quando le condizioni contengono parentesi (#11218 di @balkrushna)

  • Disabilitato ORDER BY globale per funzioni aggregaterepo.max(), repo.min(), ecc. non producono più SQL non valido con clausola ORDER BY (#11925 di @Cprakhar)

  • Subquery di paginazione include PK di entità collegateleftJoin con skip/take ora carica correttamente le entità correlate (#11669 di @mag123c)

  • Accorciamento alias con camelCase — il metodo shorten gestisce correttamente camelCase_aliases (#11283 di @OSA413)

Relazioni e Caricamento eager

  • Conflitto di alias in relazioni autoreferenziali — relazioni autoreferenziali con relationLoadStrategy: "query" non producono più SQL errato per conflitti di alias (#11066 di @campmarc)

  • Relazioni eager non più unite due volte — specificare esplicitamente relazioni eager in relations non causa più JOIN duplicati (#11991 di @veeceey)

  • Salvataggio con relazioni eager caricate — risolti errori durante il salvataggio quando un'entità ha relazioni eager caricate (#11975 di @gioboa)

  • Colonne con select: false non più restituite — colonne contrassegnate con select: false sono ora correttamente escluse dai risultati (#11944 di @gioboa)

  • Subquery con metodi joinMapOne — risolto comportamento errato usando metodi di mappatura join (#11943 di @gioboa)

  • ID relazione in entità embedded annidate — risolto TypeError: Cannot set properties of undefined nel mappare ID relazione in entità embedded (#11942 di @Cprakhar)

  • Gestione alias in RelationIdLoader — usa DriverUtils.getAlias per prevenire troncamenti alias in DB con limiti identificatori brevi (#11228 di @te1)

  • Relazioni *-to-many in createPropertyPath — rimosso gestione errori errata che bloccava configurazioni relazione specifiche (#11119 di @ThbltLmr)

Persistenza

  • Upsert con update: false o generatedType — upsert gestisce correttamente colonne che non dovrebbero essere aggiornate (#12030 di @gioboa)

  • Trasformatori applicati a FindOperatorApplyValueTransformers trasforma correttamente valori in istanze FindOperator come In, Between, ecc. (#11172 di @ZimGil)

  • L'eliminazione soft non aggiorna più le righe già eliminate softsoftDelete e softRemove ora saltano le righe già eliminate soft (#10705 by @hassanmehdi98)

  • Merge di entità rispetta i valori null — unire dati in un'entità non scarta più silenziosamente i valori di proprietà null (#11154 by @knoid)

  • Confronto mappe/oggetti — risolto il rilevamento errato dei cambiamenti per valori di colonna di tipo Map e oggetto semplice (#10990 by @mgohin)

  • Rilevamento cambiamenti nei transformer di data — risolti falsi positivi nel dirty detection con transformer di valori per date (#11963 by @gioboa)

  • Aggiornamento mpath negli elementi figli — l'mpath delle entità ad albero viene ora aggiornato correttamente durante il riposizionamento, anche con genitori eliminati soft (#10844 by @JoseCToscano)

  • Gestione proprietà virtuali nello schema builder — lo schema builder non tenta più di creare colonne per proprietà virtuali (#11000 by @skyran1278)

  • Drop di TableForeignKey senza nome — eliminare una chiave esterna senza nome esplicito non fallisce più (#10744 by @taichunmin)

  • getPendingMigrations non crea più la tabella migrations — verificare le migrazioni in sospeso non ha più effetti collaterali (#11672 by @pkuczynski)

Correttive specifiche per driver

  • PostgreSQL: persistenza/hydration di timestamptz — le colonne timestamp with time zone persistono e vengono idratate correttamente (#11774 by @Minishlink)

  • PostgreSQL: ri-salvataggio di tipi geometrici — i valori point/circle vengono normalizzati al salvataggio per evitare errori durante il ri-salvataggio di oggetti idratati (#11857 by @Cprakhar)

  • PostgreSQL/CockroachDB: tabelle con nomi quotati — gestione corretta di tabelle con caratteri speciali nei nomi (#10993 by @iskalyakin)

  • PostgreSQL: esecuzione sequenziale delle query — le query vengono ora eseguite sequenzialmente sulla stessa connessione per evitare avvisi di deprecazione di pg 8.19.0 (#12105 by @pkuczynski)

  • MySQL: rilevamento versione PolarDB-X 2.0getVersion() non restituisce più undefined per PolarDB-X 2.0 (#11837 by @Missna)

  • MongoDB: traduzione nome proprietà ObjectIdColumnfindOneBy({ id: value }) converte correttamente in _id nelle query MongoDB (#12200 by @pkuczynski)

  • MongoDB: array incorporati di documenti nidificati — elabora correttamente gli array incorporati all'interno di strutture di documenti nidificati (#10940 by @mciuchitu)

  • SQLite: array simple-enum — le colonne simple-enum con array: true non generano più errori di vincolo CHECK (#11865 by @Cprakhar)

  • SAP HANA: escape parametri Date — i valori Date di JavaScript vengono ora passati come parametri di query invece di essere incorporati nelle stringhe SQL (#11867 by @alumni)

  • CockroachDB: risultati strutturati nel ritentativo transazioni — il flag useStructuredResult viene ora preservato durante il replay dei ritentativi delle transazioni di CockroachDB (#11861 by @naorpeled)

  • Cordova: righe interessate dalle query — i risultati delle query includono ora il conteggio delle righe modificate (#10873 by @jacobg)

Altro

  • Comando CLI init — non si blocca più quando package.json non esiste (#11947 by @gioboa)

  • Import process in Deno — risolto l'import errato per la dipendenza process su Deno (#11248 by @yohannpoli)

Correzioni di sicurezza

  • Prevenzione SQL injection — query parametrizzate e identificatori con escape vengono ora utilizzati in tutti i driver per l'introspezione dello schema e i metodi DDL, prevenendo l'iniezione SQL tramite nomi di database/schema/tabella/colonna (#12207 by @pkuczynski, #12197 by @pkuczynski, #12185 by @pkuczynski)

Miglioramenti delle prestazioni

  • PostgreSQL / CockroachDB: DROP in batch in clearDatabase() — consolida le istruzioni DROP individuali in query batch singole, riducendo significativamente i round-trip durante la configurazione dei test (#12164, #12159 by @pkuczynski)