标签: psycopg2

为什么psycopg2 IntegrityError没有被捕获?

我有一些代码,我尝试写入数据库,并在某些情况下由于唯一性约束得到(预期)完整性错误.我试图抓住错误,但由于一些神秘的原因,我不能.我的代码看起来像这样(在循环中运行,为简单起见而简化):

from psycopg2 import IntegrityError
try:
    data = {
            'one': val1,
            'two': val2
        }

    query=tablename.insert().values(data)
    target_engine.execute(query)
except IntegrityError as e:
    print "caught"
except Exception as e:
    print "uncaught"
    print e
    break
Run Code Online (Sandbox Code Playgroud)

运行脚本时的输出如下所示:

uncaught
(psycopg2.IntegrityError) duplicate key value violates unique constraint "companies_x_classifications_pkey"
DETAIL:  Key (company_id, classification_id)=(37802, 304) already exists.
 [SQL: 'INSERT INTO companies_x_classifications (company_id, classification_id) VALUES (%(company_id)s, %(classification_id)s)'] [parameters: {'classification_id': 304, 'company_id': 37802L}]
Run Code Online (Sandbox Code Playgroud)

它甚至从未打印过"抓住",所以它并不认为我有完整的错误.然而,当我打印错误时,这是​​一个完整性错误.任何帮助将不胜感激!

python error-handling sqlalchemy psycopg2

15
推荐指数
1
解决办法
6161
查看次数

如何模拟psycopg2游标对象?

我在Python2中有这个代码段:

def super_cool_method():
    con = psycopg2.connect(**connection_stuff)
    cur = con.cursor(cursor_factory=DictCursor)
    cur.execute("Super duper SQL query")
    rows = cur.fetchall()

    for row in rows:
        # do some data manipulation on row
    return rows
Run Code Online (Sandbox Code Playgroud)

我想写一些单元测试.我想知道如何使用mock.patch它来修补光标和连接变量,以便它们返回一组伪造的数据?我为我的单元测试尝试了以下代码段,但无济于事:

@mock.patch("psycopg2.connect")
@mock.patch("psycopg2.extensions.cursor.fetchall")
def test_super_awesome_stuff(self, a, b):
    testing = super_cool_method()
Run Code Online (Sandbox Code Playgroud)

但我似乎得到以下错误:

TypeError: can't set attributes of built-in/extension type 'psycopg2.extensions.cursor'
Run Code Online (Sandbox Code Playgroud)

python unit-testing psycopg2 mocking python-2.7

15
推荐指数
2
解决办法
1万
查看次数

创建基于psycopg3的SQLAlchemy引擎

我需要将以下代码升级为基于psycopg版本 3 的等效代码:

import psycopg2
from sqlalchemy import create_engine

engine = create_engine('postgresql+psycopg2://', creator=connector)
Run Code Online (Sandbox Code Playgroud)

这个 psycopg2 URL 很有魅力,但是:

import psycopg # v3.1
from sqlalchemy import create_engine

engine = create_engine('postgresql+psycopg://', creator=connector)
Run Code Online (Sandbox Code Playgroud)

(我也尝试过“psycopg3”这个词但没有成功)

返回:

Traceback (most recent call last):

  File "/tmp/ipykernel_1032556/253047102.py", line 1, in <cell line: 1>
    engine = create_engine('postgresql+psycopg://', creator=connector)

  File "<string>", line 2, in create_engine

  File "/usr/local/lib/python3.10/dist-packages/sqlalchemy/util/deprecations.py", line 309, in warned
    return fn(*args, **kwargs)

  File "/usr/local/lib/python3.10/dist-packages/sqlalchemy/engine/create.py", line 534, in create_engine
    entrypoint = u._get_entrypoint()

  File "/usr/local/lib/python3.10/dist-packages/sqlalchemy/engine/url.py", line 661, in _get_entrypoint …
Run Code Online (Sandbox Code Playgroud)

python sqlalchemy psycopg2 psycopg3

15
推荐指数
2
解决办法
8328
查看次数

使用带有psycopg2的try/except或"with closing"?

我在Python中使用Psycopg2来访问PostgreSQL数据库.我很好奇是否可以安全地使用with closing()模式来创建和使用游标,或者我应该使用显式try/except包装查询.我的问题是关于插入或更新,以及交易.

据我所知,所有Psycopg2查询都发生在一个事务中,并且由调用代码来提交或回滚事务.如果在with closing(...块内发生错误,是否发出回滚?在旧版本Psycopg2的,回滚被明确发出close(),但不是这种情况了(见http://initd.org/psycopg/docs/connection.html#connection.close).

通过一个例子,我的问题可能更有意义.这是一个使用的例子with closing(...

with closing(db.cursor()) as cursor:
     cursor.execute("""UPDATE users                    
             SET password = %s, salt = %s
             WHERE user_id = %s""",
             (pw_tuple[0], pw_tuple[1], user_id))
     module.rase_unexpected_error()
     cursor.commit()
Run Code Online (Sandbox Code Playgroud)

当module.raise_unexpected_error()引发错误时会发生什么?交易是否回滚?据我了解事务,我要么提交它们要么回滚它们.那么在这种情况下,会发生什么?

或者我可以这样写我的查询:

cursor = None
try:
    cursor = db.cursor()
    cursor.execute("""UPDATE users                    
            SET password = %s, salt = %s
            WHERE user_id = %s""",
            (pw_tuple[0], pw_tuple[1], user_id))
    module.rase_unexpected_error()
    cursor.commit()
except BaseException:
    if cursor is not None:
        cursor.rollback()
finally:
    if cursor is not None: …
Run Code Online (Sandbox Code Playgroud)

python postgresql psycopg2

14
推荐指数
1
解决办法
1万
查看次数

使用python和psycopg2将数据从S3复制到AWS redshift

我在执行copy命令时遇到问题,无法从S3将数据从S3加载到Amazon的Redshift.
我有以下复制命令:

copy moves from 's3://<my_bucket_name>/moves_data/2013-03-24/18/moves'
credentials 'aws_access_key_id=<key_id>;aws_secret_access_key=<key_secret>'
removequotes
delimiter ',';
Run Code Online (Sandbox Code Playgroud)

当我使用SQL Workbench/j执行此命令时,一切都按预期工作,但是当我尝试使用python和psycopg2执行此命令时,命令传递OK但没有加载数据且没有抛出错误.
尝试了以下两个选项(假设psycopg2连接正常,因为它是):

cursor.execute(copy_command)  
cursor.copy_expert(copy_command, sys.stdout)
Run Code Online (Sandbox Code Playgroud)

两者都没有发出警告,但未加载数据

想法?

谢谢

python psycopg2 amazon-redshift

14
推荐指数
4
解决办法
2万
查看次数

psycopg2没有返回结果

我试图使用psycopg2我的postgresql数据库只是在我的本地机器上运行无法让它返回结果无论我尝试什么.它似乎连接到数据库确定,因为如果我改变任何配置参数它会抛出错误,但是,当我运行看似有效和结果有价值的查询时,我什么也得不到.

我的数据库正在运行,并且肯定有一个表:

postgres=# \c
You are now connected to database "postgres" as user "postgres".
postgres=# select * from foos;
  name   | age 
---------+-----
 Sarah   |  23
 Michael |  35
 Alice   |  12
 James   |  20
 John    |  52
(5 rows)
Run Code Online (Sandbox Code Playgroud)

我的python代码连接到这个数据库,但无论我运行什么查询,我得到None:

Python 2.7.3 (default, Apr 10 2013, 06:20:15) 
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import psycopg2
>>> conn = psycopg2.connect("dbname='postgres' user='postgres' host='localhost'")
>>> cur = conn.cursor()
>>> print …
Run Code Online (Sandbox Code Playgroud)

python postgresql psycopg2

14
推荐指数
1
解决办法
2万
查看次数

使用python将数据从csv复制到postgresql

我在Windows 7 64位.我有一个csv文件'data.csv'.我想通过python脚本将数据导入postgresql表'temp_unicommerce_status'.

我的剧本是:

import psycopg2
conn = psycopg2.connect("host='localhost' port='5432' dbname='Ekodev' user='bn_openerp' password='fa05844d'")
cur = conn.cursor()
cur.execute("""truncate table "meta".temp_unicommerce_status;""")
cur.execute("""Copy temp_unicommerce_status from 'C:\Users\n\Desktop\data.csv';""")
conn.commit()
conn.close()
Run Code Online (Sandbox Code Playgroud)

我收到了这个错误

Traceback (most recent call last):
  File "C:\Users\n\Documents\NetBeansProjects\Unicommerce_Status_Update\src\unicommerce_status_update.py", line 5, in <module>
cur.execute("""Copy temp_unicommerce_status from     'C:\\Users\\n\\Desktop\\data.csv';""")
psycopg2.ProgrammingError: must be superuser to COPY to or from a file
HINT:  Anyone can COPY to stdout or from stdin. psql's \copy command also works for anyone.
Run Code Online (Sandbox Code Playgroud)

python postgresql psycopg2 postgresql-copy

14
推荐指数
3
解决办法
3万
查看次数

无法从Python连接到Docker Postgresql实例

我正在使用Docker来"容纳"PostgreSQL部署.我可以通过命令行启动容器并连接到PostgreSQL,如下所示:

minime2@CEBERUS:~/Projects/skunkworks$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
dc176901052a        df:pg               "docker-entrypoint..."   About an hour ago   Up About an hour    5432/tcp            vigilant_agnesi

minime2@CEBERUS:~/Projects/skunkworks$ CONTAINER_ID=dc176901052a
minime2@CEBERUS:~/Projects/skunkworks$ IP=$(docker inspect -f '{{.NetworkSettings.Networks.bridge.IPAddress}}' $CONTAINER_ID)

minime2@CEBERUS:~/Projects/skunkworks$ echo $IP
172.17.0.2


minime2@CEBERUS:~/Projects/skunkworks$ docker exec -it vigilant_agnesi psql -U postgres -W cookiebox
Passwod for user postgres:
psql (9.6.5)
Type "help" for help

cookiebox#
Run Code Online (Sandbox Code Playgroud)

现在尝试与Python连接:

Python 3.5.2 (default, Sep 14 2017, 22:51:06) 
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information. …
Run Code Online (Sandbox Code Playgroud)

python postgresql psycopg2 docker

14
推荐指数
1
解决办法
2525
查看次数

TypeError:"DataFrame"类型的对象不是JSON可序列化的

我正在尝试使用我从PostgreSQL服务器获得的一些数据创建一个图形图,但是当我尝试图形时我收到一个错误:"TypeError:'DataFrame'类型的对象不是JSON可序列化的"

这是迄今为止的代码:

import dash
import numpy as np
import pandas as pd
import plotly.offline as py
import plotly.graph_objs as go
import psycopg2 as pg2
import datetime

conn = pg2.connect(database='X',user='X',password=secret)

cur = conn.cursor()

cur.execute("SELECT * FROM times;")
a = cur.fetchall()
str(a)


df = pd.DataFrame([[ij for ij in i] for i in a])
df.to_json()
df.rename(columns={0: "Serial Number", 1: "Status", 2: "Date", 3: "Time", 4: "Number"}, inplace=True);

x = df["Date"]
data = [go.Scatter(
            x=x,
            y=df["Status"])]

layout = go.Layout(title="Server Data Visualization",
                   xaxis = dict( …
Run Code Online (Sandbox Code Playgroud)

postgresql psycopg2 python-3.x pandas plotly

14
推荐指数
1
解决办法
1万
查看次数

pip install psycopg2 - 错误:命令“x86_64-linux-gnu-gcc”失败,退出状态为 1

尝试安装时出现以下错误psycopg2

   (venv) root@scw-determined-panini:/app# pip install psycopg2
    Collecting psycopg2
      Using cached https://files.pythonhosted.org/packages/a8/8f/1c5690eebf148d1d1554fc00ccf9101e134636553dbb75bdfef4f85d7647/psycopg2-2.8.5.tar.gz
    Building wheels for collected packages: psycopg2
      Running setup.py bdist_wheel for psycopg2 ... error
      Complete output from command /app/venv/bin/python3.8 -u -c "import setuptools, tokenize;__file__='/tmp/pip-build-psll6xe_/psycopg2/setup.py';f=getattr(tokenize, 'open', open)(__file__);code=f.read().replace('\r\n', '\n');f.close();exec(compile(code, __file__, 'exec'))" bdist_wheel -d /tmp/tmp52or8xexpip-wheel- --python-tag cp38:
      running bdist_wheel
      running build
      running build_py
      creating build
      creating build/lib.linux-x86_64-3.8
      creating build/lib.linux-x86_64-3.8/psycopg2
      copying lib/_json.py -> build/lib.linux-x86_64-3.8/psycopg2
      copying lib/pool.py -> build/lib.linux-x86_64-3.8/psycopg2
      copying lib/tz.py -> build/lib.linux-x86_64-3.8/psycopg2
      copying lib/_lru_cache.py -> build/lib.linux-x86_64-3.8/psycopg2
      copying lib/_ipaddress.py -> build/lib.linux-x86_64-3.8/psycopg2
      copying lib/extensions.py …
Run Code Online (Sandbox Code Playgroud)

python pip psycopg2 python-3.x python-wheel

14
推荐指数
1
解决办法
5999
查看次数