Microsoft SQL Server
Microsoft SQL Server 数据源连接器将 Prisma ORM 连接到 Microsoft SQL Server 数据库服务器。
示例
要连接到 Microsoft SQL Server 数据库,你需要在 Prisma schema 中配置一个 datasource
块。
datasource db {
provider = "sqlserver"
url = env("DATABASE_URL")
}
传递给 datasource
块的字段是:
使用 node-mssql
驱动
从 v5.4.0
起,你可以将 Prisma ORM 与 JavaScript 生态系统中的数据库驱动(而不是使用 Prisma ORM 的内置驱动)一起使用。你可以通过使用驱动适配器来实现这一点。
对于 SQLite,node-mssql
是 JavaScript 生态系统中最受欢迎的驱动之一。
本节解释了如何将其与 Prisma ORM 和 @prisma/adapter-mssql
驱动适配器一起使用。
1. 启用 driverAdapters
预览功能标志
由于驱动适配器目前处于预览阶段,你需要在 Prisma schema 中的 datasource
块上启用其功能标志。
generator client {
provider = "prisma-client-js"
previewFeatures = ["driverAdapters"]
}
datasource db {
provider = "sqlserver"
url = env("DATABASE_URL")
}
将功能标志添加到 schema 后,重新生成 Prisma Client。
npx prisma generate
2. 安装依赖项
接下来,安装 Prisma ORM 用于 node-mssql
的驱动适配器。
npm install @prisma/adapter-mssql
3. 使用驱动适配器实例化 Prisma Client
最后,当你实例化 Prisma Client 时,需要将 Prisma ORM 驱动适配器的一个实例传递给 PrismaClient
构造函数。
import { PrismaMssql } from '@prisma/adapter-mssql'
import { PrismaClient } from '@prisma/client'
const config = {
server: 'localhost',
port: 1433,
database: 'mydb',
user: 'sa',
password: 'mypassword',
options: {
encrypt: true, // Use this if you're on Windows Azure
trustServerCertificate: true, // Use this if you're using self-signed certificates
},
}
const adapter = new PrismaMssql(config)
const prisma = new PrismaClient({ adapter })
连接详情
用于连接 Microsoft SQL Server 数据库的连接 URL 遵循 JDBC 标准。
以下示例使用 SQL 身份验证(用户名和密码)以及启用的 TLS 加密连接。
sqlserver://HOST[:PORT];database=DATABASE;user=USER;password=PASSWORD;encrypt=true
注意:如果你的连接字符串中使用了以下任何字符,你将需要对其进行转义。
:\=;/[]{} # these are characters that will need to be escaped
要转义这些字符,请在包含特殊字符的值周围使用花括号 {}
。例如:
sqlserver://HOST[:PORT];database=DATABASE;user={MyServer/MyUser};password={ThisIsA:SecurePassword;};encrypt=true
参数
参数名称 | 必需 | 默认 | 注释 |
---|---|---|---|
| 否 | master | 要连接到的数据库。 |
| 否 - 见注释 | SQL Server 登录名(例如 sa )或,如果 integratedSecurity 设置为 true (仅限 Windows),则为有效的 Windows (Active Directory) 用户名。 | |
| 否 - 见注释 | SQL Server 登录名密码或,如果 integratedSecurity 设置为 true (仅限 Windows),则为 Windows (Active Directory) 用户名密码。 | |
encrypt | 否 | true | 配置是否始终使用 TLS,或仅用于登录过程,可能的值:true (始终使用),false (仅用于登录凭据)。 |
integratedSecurity | 否 | 启用Windows 身份验证(集成安全性),可能的值:true , false , yes , no 。如果设置为 true 或 yes 并且 username 和 password 存在,则通过 Windows Active Directory 执行登录。如果未通过单独的参数提供登录详细信息,则使用当前登录的 Windows 用户登录到服务器。 | |
connectionLimit | 否 | num_cpus * 2 + 1 | 连接池的最大大小 |
connectTimeout | 否 | 5 | 等待新连接的最大秒数 |
schema | 否 | dbo | 如果 schema 名称不是默认值,则作为前缀添加到所有查询中。 |
| 否 | 等待登录成功的最长秒数。 | |
socketTimeout | 否 | 等待每个查询成功的最长秒数。 | |
isolationLevel | 否 | 设置事务隔离级别。 | |
poolTimeout | 否 | 10 | 等待连接池中新连接的最大秒数。如果所有连接都在使用中,数据库将在等待给定时间后返回 PoolTimeout 错误。 |
| 否 | 设置连接的应用程序名称。自 2.28.0 版本起。 | |
trustServerCertificate | 否 | false | 配置是否信任服务器证书。 |
trustServerCertificateCA | 否 | 证书颁发机构文件的路径,用于替代系统证书以授权服务器证书。必须是 pem 、crt 或 der 格式。不能与 trustServerCertificate 参数一起使用。 |
使用集成安全性(仅限 Windows)
以下示例使用当前登录的 Windows 用户登录到 Microsoft SQL Server。
sqlserver://localhost:1433;database=sample;integratedSecurity=true;trustServerCertificate=true;
以下示例使用特定的 Active Directory 用户登录到 Microsoft SQL Server。
sqlserver://localhost:1433;database=sample;integratedSecurity=true;username=prisma;password=aBcD1234;trustServerCertificate=true;
连接到命名实例
以下示例使用集成安全性连接到 Microsoft SQL Server 的命名实例(mycomputer\sql2019
)。
sqlserver://mycomputer\sql2019;database=sample;integratedSecurity=true;trustServerCertificate=true;
Microsoft SQL Server 与 Prisma schema 之间的类型映射
有关按 Prisma ORM 类型组织的类型映射,请参阅Prisma schema 参考文档。
支持的版本
请参阅支持的数据库。
限制和已知问题
Prisma Migrate 注意事项
Prisma Migrate 在 2.13.0 及更高版本中受支持,但存在以下注意事项:
数据库 schema 名称
SQL Server 没有与 PostgreSQL 中熟悉的 SET search_path
命令等效的功能。这意味着当你创建迁移时,必须在连接 URL 中定义与生产数据库使用的相同的 schema 名称。对于大多数用户来说,这是 dbo
(默认值)。但是,如果生产数据库使用另一个 schema 名称,则所有迁移 SQL 必须手动编辑以反映生产环境或在创建迁移之前更改连接 URL(例如:schema=name
)。
循环引用
当每个模型引用另一个模型,形成闭环时,模型之间可能出现循环引用。在使用 Microsoft SQL Server 数据库时,如果关系的参照操作设置为 NoAction
以外的值,Prisma ORM 将显示验证错误。
有关更多信息,请参阅SQL Server 中参照操作的特殊规则。
破坏性更改
某些迁移会引起比你预期更多的更改。例如:
- 添加或删除
autoincrement()
。这无法通过修改列来实现,而是需要重新创建表(包括所有约束、索引和外键)并在表之间移动所有数据。 - 此外,无法从表中删除所有列(PostgreSQL 或 MySQL 可以)。如果迁移需要重新创建所有表列,它也将重新创建表。
不支持共享默认值
在某些情况下,用户可能希望将默认值定义为共享对象。
CREATE DEFAULT catcat AS 'musti';
CREATE TABLE cats (
id INT IDENTITY PRIMARY KEY,
name NVARCHAR(1000)
);
sp_bindefault 'catcat', 'dbo.cats.name';
使用存储过程 sp_bindefault
,默认值 catcat
可以在多个表中使用。Prisma ORM 管理默认值的方式是按表进行的。
CREATE TABLE cats (
id INT IDENTITY PRIMARY KEY,
name NVARCHAR(1000) CONSTRAINT DF_cat_name DEFAULT 'musti'
);
最后一个示例,在内省时,会生成以下模型:
model cats {
id Int @id @default(autoincrement())
name String? @default("musti")
}
而第一个示例则没有内省到默认值。
model cats {
id Int @id @default(autoincrement())
name String?
}
如果将 Prisma Migrate 与共享默认对象一起使用,则对它们的更改必须手动完成到 SQL。
数据模型限制
不能将具有 UNIQUE
约束和过滤索引的列用作外键
Microsoft SQL Server 只允许在一个具有 UNIQUE
约束的列中包含一个 NULL
值。例如:
- 用户表有一个名为
license_number
的列 license_number
字段具有UNIQUE
约束license_number
字段只允许一个NULL
值
解决此问题的标准方法是创建一个过滤后的唯一索引,该索引排除 NULL
值。这允许你插入多个 NULL
值。如果你未在数据库中创建索引,则尝试使用 Prisma Client 向列中插入多个 null
值时会收到错误。
然而,创建索引使得无法在数据库中将 license_number
用作外键(或在相应的 Prisma Schema 中用作关系标量字段)。
原生查询注意事项
带有 String @db.VarChar(n)
字段 / VARCHAR(N)
列的原生查询
在原生查询中,String
查询参数总是被编码为 SQL Server 的 NVARCHAR(4000)
(如果你的 String
长度小于等于 4000)或 NVARCHAR(MAX)
。如果你将 String
查询参数与类型为 String @db.VarChar(N)
/VARCHAR(N)
的列进行比较,这可能导致 SQL Server 上的隐式转换,从而影响索引性能并可能导致高 CPU 使用率。
例如:
model user {
id Int @id
name String @db.VarChar(40)
}
此查询将受到影响。
await prisma.$queryRaw`SELECT * FROM user WHERE name = ${"John"}`
为避免此问题,我们建议你始终在原生查询中手动将 String
查询参数转换为 VARCHAR(N)
。
await prisma.$queryRaw`SELECT * FROM user WHERE name = CAST(${"John"} AS VARCHAR(40))`
这使得 SQL Server 能够执行聚集索引查找而不是聚集索引扫描。