2017-01-06 5 views
1

定義されたtest()。commit()がvarcon.commit()として機能しない理由を説明してもらえますか?他のすべては正常に動作するようです。 (の放浪VirtualBoxのUbuntuで、信頼できる-32を使用して)Python3 psycopg2コミットメントの問題(接続の変数と関数を使用)

#!/usr/bin/env python3 
# -*- coding: utf-8 -*- 

import psycopg2 

varcon = psycopg2.connect('dbname=tournament') 

def test(): 
    try: 
     psycopg2.connect("dbname=tournament") 
    except: 
     print("Connection to Tournament Database Failed") 
    else: 
     return psycopg2.connect('dbname=tournament') 


def writer(): 
    #db = psycopg2.connect('dbname=tournament') 
    c =varcon.cursor() 
    c.execute('select * from players') 
    data = c.fetchall() 
    c.execute("insert into players (name) values ('Joe Smith')") 
    varcon.commit() 
    varcon.close 
    print(data) 

def writer2(): 
    #db = psycopg2.connect('dbname=tournament') 
    c =test().cursor() 
    c.execute('select * from players') 
    data = c.fetchall() 
    c.execute("insert into players (name) values ('Joe Smith')") 
    test().commit() 
    test().close 
    print(data)  

writer2() #this seem not commited, but database registers the insert by observing the serial promotion 
#writer() # this works as expected 

答えて

0

多分機能ブロック(def)でreturnステートメントが= psycopg2接続機能のような割り当てに等しくないので、これは、接続オブジェクトを返すとこれはconnまたはvarcon

conn = psycopg2.connect("dbname=test user=postgres password=secret")

http://initd.org/psycopg/docs/module.html

に割り当てられていますデータベース接続が確立されている理由

test()機能もpsycopg2接続オブジェクトを返しますが、writer2にそれが何の参照

これが存在しないことを意味変数(メモリの場所)に割り当てられていないもで初期化(説明テスト機能)が、コミット動作しません(壊れ参照)

http://www.icu-project.org/docs/papers/cpp_report/the_anatomy_of_the_assignment_operator.html

は多分試みる

ami=test()

ami.commit()

参照

+0

はあなたの非常に有用回答いただきありがとうございます! project.orgが別のものであるため、アドレスを修正するための2番目のリンクを編集してください(http://www.icu-project.org)。あなたの提案はうまくいった。また、別の方法を見つけましたが、それが良いのかどうかは分かりません: '' 'test(): try: psycopg2.connect( 'dbname = tournament') を除くpsycopg2.connect( 'トーナメントデータベースへの接続に失敗しました'他) : conn2 = psycopg2.connect( 'DBNAME =大会') conn2.autocommit = Trueの 戻りconn2''' –

+0

でhttp://stackoverflow.com/questions/11735371/how-to-test-database -connectivity-in-pythonは、Pythonでデータベース接続を確立してテストする標準的な方法です。あなたは好きなようにこれを行うことができます... –

+0

私は知られていないヒーローバッジを取得しようとするので、upvoteをしないでください:) –

0

に、あなたは、データベースへの新しい接続を開くpsycopg2.connect()呼び出すたびに確立します。

コードは1つの接続でSQLを実行し、別のコードをコミットしてから3番目の接続を閉じます。 test()機能でも、2つの異なる接続を開きます。

私は、PostgreSQLにアクセスするには、次のパターンを使用します。

conn = psycopg2.connect(DSN) 

with conn: 
    with conn.cursor() as curs: 
     ... 
     curs.execute(SQL1) 

with conn: 
    with conn.cursor() as curs: 
     ... 
     curs.execute(SQL2) 

conn.close() 

with文は、トランザクションが開かれ、適切にあなたのSQLの周りに努めていますが保証されます。また、withのコードが例外を発生させる場合に備えて、自動的にトランザクションをロールバックします。

参考:http://initd.org/psycopg/docs/usage.html#with-statement

+0

ありがとうございます。これは知っておくと良いことです。私はまだPythonとPostgreSQLについては新しいです。私はUdacityのプログラムを使って勉強していますが、興味深いことに、この方法について言及も使用もしていませんでした。なぜ私はなぜvar = psycopg2.connect(DSN)がSQL接続を自動的に生成するのか理解できませんでしたか?それは関数を呼び出すようなものではありません。私はそれがメソッドを実行することによってアクティブになると仮定します。 "conn"のグローバル値を確立して、それをさまざまな定義されたSQLクエリ関数で使用することをお勧めしますかどうかはわかりませんでした。 –

+0

'connect()'は関数です。 PostgreSQLはSQLを実行する前に、別のプロセス(またはサーバ)で実行され、SQLに接続する必要があります。その後、同じ接続を複数回再利用できます。このようにした場合、紛失した接続を再確立する準備ができている必要があります。実世界プログラムは、接続ライフサイクルの管理を担当する接続プールhttp://initd.org/psycopg/docs/pool.htmlから接続を取得します。 –

+0

ありがとうございます!私は長い道のりがあります... –

関連する問題