AWS RedShift - .NET Core(ODBC 支持?)
Posted
技术标签:
【中文标题】AWS RedShift - .NET Core(ODBC 支持?)【英文标题】:AWS RedShift - .NET Core (ODBC Support?) 【发布时间】:2017-01-31 00:32:02 【问题描述】:如何使用 .NET Core 连接 AWS RedShift 并对其运行查询?请提供代码示例。我已经阅读了 AWS 文档和 .Net Core 文档,但没有运气。
【问题讨论】:
【参考方案1】:这个答案是针对特定时间点的,不会很好地老化...
EntityFramework Core 项目是我最密切关注的项目。缺少 ODBC 是众所周知的,尤其是对于那些想要连接到 Oracle 的人。目前,您可能需要为 .NET core 分叉一个 Oracle 客户端并根据需要进行修改。
我在通过 Google 快速搜索后找到了这些项目,现在可能对您有所帮助...
-https://github.com/LinqDan/oracleclientcore - https://github.com/LinqDan/Mono.Data.OdbcCore
从长远来看,您需要密切关注这两个 GitHub 问题,它们正在针对 EntityFramework Core 和 .NETStandard API 进行跟踪。
https://github.com/dotnet/corefx/issues/13035 https://github.com/aspnet/EntityFramework/issues/74322017 年 6 月 23 日更新:
现在可以通过Npgsql.EntityFrameworkCore.PostgreSQL
NuGet 包和关联的 Entity Framework Core 包来实现。显然,PostgreSQL 团队已经厌倦了等待 ODBC 支持(在最新的netstandard2.0
中仍然不可用)并使用 netstandard 编写了他们自己的驱动程序 - 早在 11 月的时间框架。 npgsql 网站上的 getting started 页面涵盖了它在旧 JSON 项目格式中的用法 - 但列出的依赖项仍然有效。
以下是您将如何使用该软件包...
using (var conn = new NpgsqlConnection("Host=myserver;Username=mylogin;Password=******;Database=music"))
conn.Open();
using (var cmd = new NpgsqlCommand())
cmd.Connection = conn;
cmd.CommandText = "SELECT name FROM artists";
using (var reader = cmd.ExecuteReader())
while (reader.Read())
Console.WriteLine(reader.GetString(0));
使用此驱动程序时要记住一件事 - 它是为 PostgreSQL 而不是 Redshift 编写的。虽然 Redshift 基于 PostgreSQL,但它的底层引擎更像 Cassandra,而不是其他任何东西。因此,亚马逊不得不在开发中做出一些选择,以放弃 PostgreSQL 支持的某些东西——比如 SQL 变量。因此,对于您可能在其他实体框架实现中习惯的某些事情,您将获得相当有限的体验。只要您继续使用直接访问 *Connection、*Command 和 DataReader 类并编写自己的 SQL,就可以了。
【讨论】:
我更新了我的答案@shahed-kazi 以包含一个纯 .NET 标准的连接方法。【参考方案2】:在撰写此答案时,有现成的适用于 Redshift 的 ODBC 驱动程序。
对于Windows,您可以在此处找到“Amazon Redshift”驱动程序安装文件:https://docs.aws.amazon.com/redshift/latest/mgmt/install-odbc-driver-windows.html
这需要安装在运行连接到 Redshift 所需应用程序的机器上。对于自动化部署,最好有一个 powershell 脚本(或 MSBuild 步骤)来检查它是否安装在生产机器上,如果不存在则安装它。
对于 Linux,可以在此处找到驱动程序:https://docs.aws.amazon.com/redshift/latest/mgmt/install-odbc-driver-linux.html
由于 .NET Core 的大部分世界正在转向使用 Linux docker 容器,我将进一步详细说明如何使用 Dockerfile
在 docker 环境中进行设置。
首先,您需要创建一个 shell 脚本(例如 install-driver.sh
),从上面的链接中为您想要的相关 odbc 驱动程序执行 apt-get
。
类似这样的:
#!/bin/bash
# Install the Redshift ODBC driver manager
apt-get update \
&& apt-get install -y --no-install-recommends unixodbc
if ! curl -s https://s3.amazonaws.com/redshift-downloads/drivers/odbc/[latestversion].deb -o driver.deb; then
echo 'Failed to download Redshift ODBC Driver!' 1>&2
exit 1
fi
# Install the Redshift ODBC driver
apt install ./driver.deb
在 Linux 上配置 Amazon Redshift ODBC 驱动程序还需要三个文件:amazon.redshiftodbc.ini
、odbc.ini
和 odbcinst.ini
。这在这里解释:https://docs.aws.amazon.com/redshift/latest/mgmt/odbc-driver-configure-linux-mac.html
如该链接中所述,您必须将以下行添加到您的 .sh
文件中:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
export ODBCINI=/etc/odbc.ini
export AMAZONREDSHIFTODBCINI=/etc/amazon.redshiftodbc.ini
export ODBCSYSINI=/usr/local/odbc
创建.sh
和.ini
文件后,将它们放入一个公共目录(例如/odbc/
),并将它们作为Dockerfile
命令的一部分包含在内。像这样:
FROM microsoft/dotnet:2.1-sdk AS base
WORKDIR /app # or wherever your working directory resides
COPY ./odbc/odbc.ini /etc/odbc.ini
COPY ./odbc/odbcinst.ini /etc/odbcinst.ini
COPY ./odbc/amazon.redshiftodbc.ini /etc/amazon.redshiftodbc.ini
COPY ./odbc/install-driver.sh /tmp/install-driver.sh
RUN chmod +x /tmp/install-driver.sh
RUN /tmp/install-driver.sh
# dotnet restore, build, publish and ENTRYPOINT commands here...
这应该足以让您在 docker 容器中安装 Redshift 驱动程序运行 docker build
和 docker run
命令。
这意味着您的应用程序代码可以像使用任何其他数据库驱动程序一样使用OdbcConnection
:
using System;
using System.Data;
using System.Data.Odbc;
// field within class... value should be set from config
private string redshiftConnectionString = "Driver=Amazon Redshift (x64); Server=redshiftclusterhostname.region.redshift.amazonaws.com; Database=database; UID=user; PWD=password; Port=5439"
public DataSet ExecuteQuery(string query)
var dataSet = new DataSet();
using (var connection = new OdbcConnection(this.redshiftConnectionString))
var adapter = new OdbcDataAdapter(query, connection);
adapter.Fill(dataSet);
return dataSet;
请注意,Driver=
值应该是您选择下载和安装的驱动程序的名称。
【讨论】:
【参考方案3】:只需通过 JDBC 或 ODBC Driver 连接到 Amazon Redshift 并像普通 SQL 数据库一样访问它。
您将使用 AWS API 启动/停止集群,但所有查询和请求都通过 SQL 连接进行。
【讨论】:
谢谢约翰,我明白了,但你能提供使用 .NET Core 的示例代码吗? 我认为 .NET Core 不支持通过 ODBC 驱动程序连接/查询。 没有以任何方式回答使用 .net 核心这个问题的关键点,迄今为止(2.0)仍然没有 ODBC,它在这个阶段被定为 2.1github.com/dotnet/corefx/issues/13035以上是关于AWS RedShift - .NET Core(ODBC 支持?)的主要内容,如果未能解决你的问题,请参考以下文章
如何在 ASP.NET (Core 2) Web 应用程序中访问来自 AWS 的认证?
如何从 AWS Lambda .Net Core 应用程序 API 连接到 AWS RDS SQL Server?
通过 SSH 隧道连接到 .Net Core 中的 AWS DocumentDb
无法从 AWS lambda 连接 AWS redshift
AWS Lambda Dot Net Core 3.1 在使用 Aspose Cells for .Net 时抛出 gdip 异常