使用ANSI驱动程序连接到带有PYTHON PECHCOPG2的PostgreSQL数据库 [英] Useing ANSI driver to connect to a postgreSQL DB with python psycopg2

查看:19
本文介绍了使用ANSI驱动程序连接到带有PYTHON PECHCOPG2的PostgreSQL数据库的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我必须将数据从一个PostgreSQL数据库(旧的)传输到另一个PostgresSQL数据库(新的)。 OLD是在Win1252中编码的。New是以UTF-8编码的。

我已经尝试了不同的方法,例如。PANDAS.TO_SQL、SQLALCHEMIY、PECKCOPG2等等,但由于编码问题而总是失败。我做了一些研究,最有说服力的事情看起来像是司机方面的问题。据我所知,ekCopg2使用Unicode驱动程序,但对于我的源数据库版本(x86_64上的PostgreSQL 9.4.20),我必须使用ANSI来绕过这些编码问题。

我已经使用ETL工具测试了是否可以在不出现编码问题的情况下导出受影响的表。这是可能的,没有问题。由于这次测试,我非常肯定这不是真正的编码问题,而不是驱动程序处理问题。

当我刚刚使用一个样本来测试加载数据是否正常工作时,我已经注意到 pandas 速度很慢。我得装上1.2 MIO的录音机。但这将永远持续下去。因此,PostgreSQL复制方法是可以首选的方法。从我的角度来看,心理备份2使用的是标准连接字符串(https://halvar.at/python/odbc_dsn_connection_strings/)。但我必须使用ANSI驱动程序。

我试图将一个SQLAlChemy传递给您的心理备份2连接器。但这不起作用。

stage_engine_string = ("{PostgreSQL ANSI}+psycopg2://" + str(stage_user) + ":" + str(stage_password) +  "@" + str(stage_host) + ":"  + str(stage_port) + "/" + str(stage_database))

因为

conn = psycopg2.connect(**params)

仅允许传递参数。

host = 
database = 
user = 
password = 
port = 

在尝试上述操作之前,我尝试了ex。

cur.copy_to(open("sql_tmp_export.csv", "w", encoding="utf-8", errors="ignore"), "table", sep=";", columns=("no","description"))

conn.decode("win1250").encode("utf8")

conn.set_client_encoding("win1250")

但我一直收到编码问题。根据Postgres的文档,在UTF8和Win1250之间切换应该不会有问题。

在ETL工具上,我遇到了类似的问题,但通过发送

"set client_encoding="windows-1250"

在建立与数据库的连接之后。

但如果我在心理备份2中尝试此操作

cur.execute("set client_encoding="windows-1250;select * from table")

我仍然遇到编码问题。

如果我可以选择让司机建立心理连接,有什么线索吗?我认为这应该可以解决我的问题。

推荐答案

我的常规问题现在也解决了。但解决方案很奇怪。如果有人执行类似的操作,我只需将相同的脚本运行两次,但首先使用Limit和Offset。

def any_postrgres_method_to_load_data_from_db:
      conn = some_lib.conect(var1, var2)
      cur = conn.cursor()

      sql_pre_statement = """
        set client_encoding = "Windows-1250"
        """
      cur.execute(sql_pre_statement)

      sql_statement = """
        select * from n
        """
      cur.execute(sql_statement)
      df = pandas.read_sql_query(sql, conn)
      df.to_csv("sql_tmp_export.csv", index=False)
上面的脚本返回了几个编码问题。 在运行如下所示的略微调整的脚本后,我能够运行原始脚本。

def any_postrgres_method_to_load_data_from_db:
      conn = some_lib.conect(var1, var2)
      cur = conn.cursor()

      sql_pre_statement = """
        set client_encoding = "Windows-1250"
        """
      cur.execute(sql_pre_statement)

      sql_statement = """
        select * from n offset 500 limit 1000
        """
      cur.execute(sql_statement)
      df = pandas.read_sql_query(sql, conn)
      df.to_csv("sql_tmp_export.csv", index=False)

我真的无法解释这一点。我只是感觉远程数据库上的缓存中有一些奇怪的东西。

这篇关于使用ANSI驱动程序连接到带有PYTHON PECHCOPG2的PostgreSQL数据库的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆