【问题标题】:SQL Server statements imported into Postgres DB now unable to see images - Rails Project导入 Postgres DB 的 SQL Server 语句现在无法看到图像 - Rails 项目
【发布时间】:2018-01-15 09:27:03
【问题描述】:

昨天我能够弄清楚如何使用以下查询来消除重复的结果(如有必要,请参阅 SQL Query to delete duplicate values in a 3 tables inner join with two different databases 了解更多信息):

SELECT 
    "AM-Martin".dbo.CpCore_Site.Number,"AM-Martin".dbo.CpCore_Site.Latitude,"AM-Martin".dbo.CpCore_Site.Longitude,"AM-Martin".dbo.CpSm_Face.RetiredOn,**CAST("AM-Martin_bin".dbo.CpCore_Image.Bytes as Varbinary)**, "AM-Martin".dbo.CpCore_Site.Name, "AM-Martin".dbo.CpCore_Site.Zipcode
FROM
    "AM-Martin".dbo.CpCore_Site

INNER JOIN "AM-Martin".dbo.CpSm_Face on "AM-Martin".dbo.CpSm_Face.SiteId = "AM-Martin".dbo.CpCore_Site.Oid
INNER JOIN "AM-Martin_bin".dbo.CpCore_Image on "AM-Martin".dbo.CpSm_Face.Oid = "AM-Martin_bin".dbo.CpCore_Image.OwnerId

WHERE
    "AM-Martin".dbo.CpSm_Face.RetiredOn LIKE '%9999%'

     AND "AM-Martin".dbo.CpCore_Site.Number LIKE N'%LA%' OR "AM-Martin".dbo.CpCore_Site.Number LIKE N'%LC%' OR "AM-Martin".dbo.CpCore_Site.Number LIKE N'%BH%'


     AND "AM-Martin".dbo.CpCore_Site.Latitude > 0.0

GROUP BY "AM-Martin".dbo.CpCore_Site.Number,"AM-Martin".dbo.CpCore_Site.Latitude,"AM-Martin".dbo.CpCore_Site.Longitude,"AM-Martin".dbo.CpSm_Face.RetiredOn,**CAST("AM-Martin_bin".dbo.CpCore_Image.Bytes as Varbinary)**, "AM-Martin".dbo.CpCore_Site.Name, "AM-Martin".dbo.CpCore_Site.Zipcode;

这个查询允许我在图片列上使用Group By。之后,我将数据放入 SQL 语句中,并将它们导入我的 Postgres SQL DB。当我单击图像值时,我无法打开它,我在程序 (RazorSQL) 中收到的消息是:

无法显示图片

我还直接检查了运行查询的 SQL 数据库表,但无法打开图像。我怀疑它与这条线有关:

**CAST("AM-Martin_bin".dbo.CpCore_Image.Bytes as Varbinary)** 

现在的问题是图像值被编码,当我像下面的 SQL 语句一样传输它们时,我不知道如何解码它们:

CREATE TABLE "map" (
    number varchar(32) NOT NULL,
    latitude float NOT NULL,
    longitude float NOT NULL,
    retiredon timestamp NOT NULL,
    image bytea NOT NULL,
    name varchar(256) NOT NULL,
    zipcode varchar(11) NOT NULL
);

INSERT INTO map("number", "latitude", "longitude", "retiredon", "image", "name", "zipcode") VALUES ('BH-0001', 34.059858, -118.376056, '9999-12-31 00:00:00.0', decode('FFD8FFE000104A46494600010100000100010000FFDB0043000604050605','hex'), 'NB La Cienega Blvd FS Olympic Blvd NEC', '90035');

我想在我的网站上呈现图像,但它们似乎已编码。当我在 SQL 语句中将它们从 SQL 服务器带到 postgresql 时,如何解码它们?

更新

我尝试在没有图像列的情况下在我的 rails 项目中渲染图像,一切正常。一旦我尝试渲染图像数据,我就会收到以下错误消息:

编码::UndefinedConversionError

另见

【问题讨论】:

  • 嗨!您是否考虑过构建一个简单的应用来执行此操作?
  • @ignacio 你能详细说明一下吗?这是我正在处理的一个更大项目的一部分,我现在正在处理后端。
  • 当然是杰梅因!我认为构建一个应用程序(如果你愿意,我可以在 C# 中发布一个示例)以从 MSSQL 下载图像然后将它们插入 PostgreSQL 将是一个不错的选择。
  • 我更新了我的问题,我认为我不太清楚,请检查一下现在是否有意义。
  • 让我看看我是否理解这个问题... 有没有可能是图像没有从一个数据库复制到另一个数据库,或者您确定问题出在 Rails 中?我没有使用 Rails 的经验,但我正在考虑进行查询以将图像检索到应用程序,然后让连接器 (Npgsql) 将它们插入 Postgresql。

标签: ruby-on-rails sql-server database postgresql gmaps4rails


【解决方案1】:

在将图像作为字符串迁移到数据库之前,您可能需要考虑将字节转换为十六进制,然后在显示之前将它们转换回字节形式。有关翻译的帮助,请参阅 this blog

或者,您可以随时尝试在 AWS 上托管您的图片,并将图片网址作为字符串保存在您的数据库中。

【讨论】:

  • 我认为您正在做一些事情,我认为我可以在模型中编写一个可以将 varbinary 转换回其原始格式的方法。我需要考虑如何。