在Julia中使用MS SQL Server
Julia中使用MS SQL Server
是时候为您的数据分析工作流提速了
SQL数据库是全球范围内部署最广泛的软件之一。它们是从商业数据分析到天气预报等众多应用程序的基础。目前存在许多客户端-服务器实现方案,而微软的SQL Server就是其中之一。完整功能的开发人员版可免费使用。它可以在Windows、Linux和通过Docker上运行。
数据科学家经常需要与存储在SQL数据库中的数据进行交互。虽然可以轻松找到使用Python等语言进行此操作的指南,但是使用Julia的教程却非常稀缺。因此,在本文中,我将重点介绍如何使用Julia与SQL Server进行工作。示例代码是在运行Linux(Elementary OS)上的Julia 1.9.1的Pluto笔记本中生成的。
先决条件
- SQL Server 2022
您需要在本地运行一个SQL服务器。最简单的设置方法是通过Docker。 SQL Server 2022的说明在这里。要验证Docker容器是否正在运行,请使用以下命令:
watch -n 2 sudo docker ps -a
这将每2秒更新一次,状态列应显示类似于“Up X分钟”的内容,其中X是容器启动后经过的时间。
2. Microsoft ODBC驱动程序17 for Linux
说明在这里。我无法使用更新的驱动程序18连接到数据库,因此无法推荐使用该驱动程序。
3. sqlcmd实用程序(可选)
sqlcmd实用程序允许您输入Transact-SQL语句,并且非常适用于测试是否按预期工作。请按照这里的说明进行操作。
加载包
需要以下Julia包。在使用Pluto笔记本时,它的内置包管理器将自动为您下载和安装这些包。
using ODBC, DBInterface, DataFrames
检查驱动程序
开放数据库互连(ODBC)驱动程序允许我们连接到SQL服务器。使用ODBC.jl包,我们可以检查系统上当前可用的驱动程序:
一旦知道驱动程序的位置,也可以安装驱动程序。
要删除驱动程序,请使用:
添加连接
使用完整的连接字符串,我们现在可以连接到之前设置的本地运行的SQL服务器。需要IP地址、端口、现有数据库名称、用户ID和密码。请注意,如果数据库名称未知,我们可以连接到’master’,因为默认情况下始终存在该名称。
列出所有现有数据库
使用conn_master对象,我们现在可以在服务器上执行查询。让我们列出所有数据库。
创建新数据库
为了创建新的数据库,我们首先应该使用list_db函数检查该名称是否已经存在。如果不存在,那么我们可以按照下面的示例创建一个名为‘FruitsDB’的数据库。
再次列出所有的数据库,我们可以验证‘FruitsDB’现在已经创建成功。
创建新表
SQL Server数据库可以包含一些表,它们只是数据的有序集合。表本身就是一些行的集合,也被称为记录。在我们开始填充表之前,我们首先需要在现有的数据库中创建它。作为一个示例,让我们在‘FruitsDB’中创建一个名为‘Price_and_Origin’的表。这个表将包含三个列——Name(字符串)、Price(浮点数)和Origin(字符串)。注意,VARCHAR(50)用于表示可变大小的字符串数据。50是字节大小,在单字节编码中也表示字符串的长度。
向新表添加数据
一旦表存在,我们就可以向其添加数据。最简单的方法是使用DataFrame作为数据源。请记住,我们的表‘Price_and_Origin’需要三列,包括名称、价格和产地。因此,我们可以使用下面的一些虚拟数据:
要插入值,我们可以使用DBInterface.executemany函数,该函数允许按顺序传递多个值。如下所示的函数可实现此功能。finally子句确保使用DBInterface.close!函数关闭数据库连接。这通常是一个好习惯,可以避免意外地在其他操作中重复使用同一个连接。
让我们验证一下数据库是否按照我们的预期进行了填充。我们首先建立一个连接‘conn_fruit’,连接到SQL Server上的‘FruitsDB’。然后我们可以从表‘Price_and_Origin’中选择所有的条目,并将其传递给DataFrame。
更新表
按照前一部分的顺序,现在可以用新数据更新数据库。
让我们验证一下新数据是否确实存在于数据库中。
删除重复项
重新执行上面的add_to_fruit_table函数将会向表中添加重复的行。
使用公共表达式(CTE),我们可以从给定的表中删除重复的行。以下函数帮助我们实现这一目标:
检查行是否唯一。
删除记录
通常需要从数据库中的表中删除符合特定条件的条目。例如,我们可以删除价格大于95的所有水果,如下所示:
删除表
使用DBInterface.execute函数中的DROP语句,可以删除一个表。函数的其余部分与delete_rows保持不变。
DBInterface.execute(conn_db, "DROP TABLE $table_name")
结论
DBInterface.execute函数接受有效的SQL语句作为输入。因此,除了已经介绍的内容,还可以执行所有种类的查询。如前所示,查询的结果可以轻松传递给Julia DataFrame sink,然后可以用于执行其他操作。
ODBC.jl和DBInterface.jl包正在积极维护,并且似乎与现有的工作流程很好地集成在一起,特别是如果涉及使用DataFrames。这为使用Julia进行数据分析和可视化开辟了令人兴奋的新可能性。希望您觉得本次练习有用。谢谢您的时间!请与我在LinkedIn上联系或访问我的Web 3.0动力网站。
参考资料
- https://odbc.juliadatabases.org/stable/#Getting-Started
- https://juliadatabases.org/DBInterface.jl/dev/
- https://www.w3schools.com/sql/default.asp
- https://learn.microsoft.com/en-us/sql/?view=sql-server-linux-ver16