AWS RedShift - .NET Core(ODBC支持?)

时间:2017-01-31 00:32:03

标签: odbc .net-core amazon-redshift .net-standard

如何使用.NET Core连接和运行针对AWS RedShift的查询?代码示例请。我已经浏览了AWS docs和.Net Core文档,但没有运气。

3 个答案:

答案 0 :(得分:7)

这个答案是特定时间点的答案,并且不会老化......

EntityFramework核心项目是我最关注的项目。缺乏ODBC是众所周知的,特别是对于那些想要连接到Oracle的人。目前,您可能需要为.NET核心分叉Oracle客户端并根据需要进行修改。

我在快速的Google搜索后找到了这些项目,现在可能可以为您提供帮助......

- https://github.com/LinqDan/oracleclientcore - https://github.com/LinqDan/Mono.Data.OdbcCore

从长远来看,您需要密切关注这两个跟踪EntityFramework Core和.NETStandard API的GitHub问题。

更新6/23/2017:

现在可以通过Npgsql.EntityFrameworkCore.PostgreSQL NuGet包和相关的Entity Framework Core包实现。显然,PostgreSQL团队已经厌倦了等待ODBC支持(目前还没有最新的netstandard2.0),并且在11月的时间框架内使用netstandard编写了自己的驱动程序。 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,你应该没问题。

答案 1 :(得分:0)

在编写此答案时,有可用于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.iniodbc.iniodbcinst.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 builddocker 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=值应该是您选择下载和安装的驱动程序的名称。

答案 2 :(得分:-3)

只需通过JDBC或ODBC Driver连接到Amazon Redshift,然后像普通SQL数据库一样访问

您将使用AWS API启动/停止群集,但所有查询和请求都通过SQL连接进行。