Flyway 可以使用 Sql Express LocalDB

Posted

技术标签:

【中文标题】Flyway 可以使用 Sql Express LocalDB【英文标题】:Can Flyway use a Sql Express LocalDB 【发布时间】:2021-10-24 12:08:42 【问题描述】:

我们有一个基于微服务的应用程序。部署的应用程序将在完整版本的 Microsoft SQL Server 上运行。对于 UnitTesting,我想使用 SQL-Express 的干净 localdb 实例,以确保我的测试的恒定输出。 为了管理数据库方案,我们使用 flyway 脚本。

现在是个大问题: 是否可以在 localdb 实例上使用 flyway?

(我在互联网上没有找到任何东西。)

欢迎任何帮助!

编辑:找到解决方案!请看下面的帖子

编辑: 这是我通过尝试连接到我的 localdb 实例得到的结果

ERROR:
Unable to obtain connection from database (jdbc:sqlserver://(localdb)\MSSQLLocalDB;databaseName=IntegrationTest;integratedSecurity=true) for user 'sa': Fehler beim Herstellen einer Verbindung mit dem Host "(localdb)", benannte Instanz "mssqllocaldb". Fehler: "java.net.UnknownHostException: (localdb)". Überprüfen Sie die Server- und Instanznamen, und stellen Sie sicher, dass der UDP-Datenverkehr an Port 1434 nicht von einer Firewall blockiert wird. Überprüfen Sie für SQL Server 2005 oder höher, ob der SQL Server-Browserdienst auf dem Host ausgeführt wird.
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
SQL State  : 08S01
Error Code : 0
Message    : Fehler beim Herstellen einer Verbindung mit dem Host "(localdb)", benannte Instanz "mssqllocaldb". Fehler: "java.net.UnknownHostException: (localdb)". Überprüfen Sie die Server- und Instanznamen, und stellen Sie sicher, dass der UDP-Datenverkehr an Port 1434 nicht von einer Firewall blockiert wird. Überprüfen Sie für SQL Server 2005 oder höher, ob der SQL Server-Browserdienst auf dem Host ausgeführt wird.

Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: Fehler beim Herstellen einer Verbindung mit dem Host "(localdb)", benannte Instanz "mssqllocaldb". Fehler: "java.net.UnknownHostException: (localdb)". Überprüfen Sie die Server- und Instanznamen, und stellen Sie sicher, dass der UDP-Datenverkehr an Port 1434 nicht von einer Firewall blockiert wird. Überprüfen Sie für SQL Server 2005 oder höher, ob der SQL Server-Browserdienst auf dem Host ausgeführt wird.

我在 cmets 中测试了 Jeroen Mosterd 的建议。看来我可能更进了一步,但似乎仍然缺少一些东西。链接的问题以及 SqlLocalDB.exe 告诉我一些关于 \tsql\query 但flyway 只会使用 \sql\query

ERROR:
Unable to obtain connection from database (jdbc:jtds:sqlserver://./IntegrationTest;instance=LOCALDB#5F8273EF;namedPipe=true) for user 'ddlAdmin': Network error IOException: \\.\pipe\MSSQL$LOCALDB#5F8273EF\sql\query (Das System kann die angegebene Datei nicht finden)
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
SQL State  : 08S01
Error Code : 0
Message    : Network error IOException: \\.\pipe\MSSQL$LOCALDB#5F8273EF\sql\query (Das System kann die angegebene Datei nicht finden)

Caused by: java.sql.SQLException: Network error IOException: \\.\pipe\MSSQL$LOCALDB#5F8273EF\sql\query (Das System kann die angegebene Datei nicht finden)
Caused by: java.io.FileNotFoundException: \\.\pipe\MSSQL$LOCALDB#5F8273EF\sql\query (Das System kann die angegebene Datei nicht finden)

【问题讨论】:

这能回答你的问题吗? Connecting to SQL Server LocalDB using JDBC 链接查询中还讨论了MSSQL$ 问题,并带有指向this 的链接。不过,总的来说,这些问题会让我对将 LocalDB 与 JDBC 结合使用感到谨慎。只是采取阻力最小的路径并安装 SQL Server Express 似乎更好,否则配置与生产的距离越远,您需要应用的黑客和分叉就越多。不知道为什么这不会让您获得“恒定输出”或为什么这很重要,但您始终可以以编程方式重新启动服务器。 我很想简单地使用 SQL Server Express,但遗憾的是,这在我们公司有点难以实现 ^^ 我们的 IT 部门在给予我们足够的减速器权限方面相当严格。我已经很高兴能够在我的计算机上使用 localdb。我们的 SQL Server 上有一个开发数据库,​​但我更喜欢使用一些本地服务器来确保我有一个干净的数据库用于我的测试。 无论如何,谢谢你为我指明了正确的方向。我之前偶然发现了这个问题,但你让我重新阅读它并让我找到了一个可行的解决方案。 【参考方案1】:

我不得不将 Flyway 的 jTDS 驱动程序替换为来自原始 jTDS 的 Fork 的较新的 Alternative jTDS Driver。 Jeroen Mostert 的链接确实帮助我指出了使用新连接字符串和找到新驱动程序的正确方向。

如何解决: 将 jtds-1.3.3.jar 复制到 FlywayVersion 中的驱动程序文件夹 删除已弃用的jtds-1.3.1.jar 执行SqlLocalDB.exe info MSSQLLocalDB 以获取您的管道名称Pipename der Instanz: np:\\.\pipe\LOCALDB#5F8273EF\tsql\query 在 flyway 的连接字符串中仅使用 LOCALDB#5F8273EF 部分 连接字符串:flyway.url=jdbc:jtds:sqlserver://./<DatabaseName>;instance=LOCALDB#5F8273EF;namedPipe=true

重要提示:请确保在执行脚本之前创建数据库和您要在flyway中使用的用户。

【讨论】:

以上是关于Flyway 可以使用 Sql Express LocalDB的主要内容,如果未能解决你的问题,请参考以下文章

Flyway 是不是有我们可以在 SQL 迁移中使用的“数据库名称”占位符?

如何创建脚本或 Flyway 可以配置为每次使用 SQL 回调调用它?

Flyway 迁移 Oracle PL/SQL 转储

使用 Spring Boot 记录 Flyway sql

Flyway 5.0.7 非事务性迁移 MS-SQL

程序开发数据库版本控制必备 - Flyway