postgresql - psycopg2 不插入 unicode 数据
问题描述
我有一个脚本,它从一个数据库中获取数据并根据表的名称和字段将其复制到另一个数据库中。问题是关于 unicode 数据的,我需要用俄语插入一些单词,但每次 psycopg2 都将其写入,就好像它是默认字符串一样。
import psycopg2
import psycopg2.extensions
conn_two = psycopg2.connect(user="postgres", password="password", host = "localhost", port= "5432", dbname = "base2")
cur_2 = conn_two.cursor()
sql = 'INSERT INTO {} ({}) VALUES {};'.format('"tb_names"', '"num", "name", "district"', (23, 'Рынок', 'Волжский'))
cur_2.execute(sql)
conn_two.commit()
以下是 pgAdmin4 中的结果:
我也尝试在 unicode 中设置 exteinsions 和插入数据,但在这种情况下我有一个错误
import psycopg2
import psycopg2.extensions
psycopg2.extensions.register_type(psycopg2.extensions.UNICODE)
psycopg2.extensions.register_type(psycopg2.extensions.UNICODEARRAY)
conn_two = psycopg2.connect(user="postgres", password="password", host = "localhost", port= "5432", dbname = "base2")
conn_two.set_client_encoding("utf-8")
conn_two.set_client_encoding('UNICODE')
cur_2 = conn_two.cursor()
sql = 'INSERT INTO {} ({}) VALUES {};'.format('"tb_names"', '"num", "name", "district"', (23, u'Рынок', u'Волжский'))
cur_2.execute(sql)
conn_two.commit()
Traceback (most recent call last):
File "D:\_Scripts\pgadmin.py", line <>, in <module>
cur_2.execute(sql)
psycopg2.ProgrammingError: ОШИБКА: тип "u" не существует # - says that type "u" does not exist
LINE 1: ...ing_ex" ("num", "name", "district") VALUES (23, u'\u0420\u...
^
这里应该做什么?
解决方案
不要使用嵌入的值准备字符串(使用字符串格式或连接)。
相反,%s
在 SQL 字符串中使用作为占位符,然后将您的值.execute
作为参数传递给方法。
如果您使用的是 Python 2.x,则非 ASCII 字符串应作为 Unicode 类型传递。
例如
Python 2.x
sql = 'INSERT INTO "tb_names" ("num", "name", "district") VALUES (%s, %s, %s);'
cur_2.execute(sql, (23, u'Рынок', u'Волжский'))
Python 3.x
sql = 'INSERT INTO "tb_names" ("num", "name", "district") VALUES (%s, %s, %s);'
cur_2.execute(sql, (23, 'Рынок', 'Волжский'))
推荐阅读
- c++ - 逻辑 && 是否可以很好地替代无分支 POV 中的 if 语句
- android - ViewPager2 滑动选项卡布局不显示片段名称
- python - 用 Python 绘制几种颜色的冲浪图
- cypress - 在柏树中,有没有办法检查一定数量的相同文本或链接实例?
- c# - 正则表达式检查字符串中某处至少 2 个字符
- reactjs - Redux 存储包含正确的状态,但似乎是错误的
- python - 在 Anaconda 中找不到 pygame
- javascript - 使用 foreach asp.net 核心中的 multiplus 按钮获取值
- qt - 使用 QML OpacityMask 对覆盖矩形的上角进行四舍五入
- python - Nginx 和 Gunicorn WSGI 变量