私は持ち込ま与える「の」2つのタイトルだった場合は大声を教えて??面白いマニュアル
需要
ソフトウェアの一部関係者のGitHubアドレスを PostgreSQLが自動的にデータベースを作成するには、シーケンステーブルと関数の後に作成され、自動的に実行するように設定され、それでも手動でデータベースを作成したい、不便、およびシーケンステーブルを作成するために、同じ方法を使用したいされていますについて、
プロセス
次のようにDDL文は、次のとおりです。
DB_NAME = "" " CREATE DATABASEの 場合 ではない が存在する{}; ALTER DATABASE {} OWNER TO のPostgresと 、""" .format(DATABASE_NAME、DATABASE_NAME)
psycopg2.ProgrammingError:構文エラーまたはその付近「ではない」 LINE 2:CREATE DATABASEの場合 test_classs存在しません。
とき問題はないああ(私が作成した後、削除機能を使用)し、これが与えられているか、シーケンステーブルを作成しますか?削除する「が存在しない場合は、」機能を実現する、その後、正常に実行する原理は、私が入れ、結果が与えられました。
psycopg2.InternalError:DATABASEはトランザクションブロック内で実行することはできませんCREATE
あなたはトランザクションブロックでデータベースを作成することはできません、それはおそらく、この不安、BaiduのプラスGoogleは、二つの方法があることを意味します。
次のような1 psycopg2の拡張機能でISOLATION_LEVEL_AUTOCOMMIT、原理は任意のトランザクションにコマンドを発行する場合、接続は文字通り意味し、定数名を参照し、起動しないようにすることです自動的に送信され、そして(コミットする必要はありませんが)またはrollback()
輸入psycopg2 から psycopg2.extensionsはインポート ISOLATION_LEVEL_AUTOCOMMITの#ADDこのライン- < CON = psycopg2.connect(... ) con.set_isolation_level(ISOLATION_LEVEL_AUTOCOMMIT) #ADD THIS LINEの- < CUR = con.cursor() cur.executeを(" DATABASE%Sを作成します。"%のself.db_name) cur.close() con.close()
2.自動コミットは、接続のような、接続オブジェクトを使用している、自動送信モードを属性してみましょう:
インポートpsycopg2 CON = psycopg2.connect(...) con.autocommit = Trueの CUR = con.cursor() cur.execute(' CREATE DATABASE {}; ' .format(DB_NAME)) cur.close() #接続されていない場合オフ、バック接続オブジェクトの自動コミットの要求される特性に con.autocommit = Falseの #接続が閉じている場合は、上記ライン行う必要がない #1 con.closeを()
しかし、私は実行するか、または別のエラーが発生したとき:
psycopg2.InternalError:CREATE DATABASEから実行できない機能やマルチコマンド文字列
文字通りデータベース機能で作成されていない、話す、およびマルチコマンドの文字列でデータベースを作成することはできません、関数が私には無用である、マルチラインのみのコマンドで、そして彼のDDL文を見て、彼は自分自身を発見しましたもう少しセクションのテーブルを作成するDDL文をコピーします。。二つの例上記のすべてのこれらの問題ではありません後、最も単純なものから、それを開始するには、DDL文を読みます:
DB_NAME = "" " CREATE DATABASE {}; """ .format(DATABASE_NAME)
遅いDiudiuがあるが、再び実行して、それでも成功を作成したが、ここで、私はそのような次の要件として、理由は簡単で、この長い定数をインポートする必要があり、制御が非常に簡単無しの、第二の方法を使用することをお勧めします、第二のデータベースを作成し、最初のデータベースを作成します(このような素晴らしい仕事の要件があるだろうか、ハハ、説明の便宜上のものであり)
インポートpsycopg2 から psycopg2.extensionsがインポートISOLATION_LEVEL_AUTOCOMMITをISOLATION_LEVEL_DEFAULT DATABASE_NAME = ' test_classs ' DATABASE_NAME2 = ' test_classssssss ' DB_NAME = "" " DATABASE {}作成します 。""" .format(DATABASE_NAME)を DB_NAME2 = ""」 DATABASE {}を作成します。 "" " .format(DATABASE_NAME2) CONN = psycopg2.connect(... ) conn.set_isolation_level(ISOLATION_LEVEL_AUTOCOMMIT) CUR = CONN。カーソル() CUR。実行(DB_NAME) conn.set_isolation_level(ISOLATION_LEVEL_DEFAULT) cur.execute(DB_NAME2) cur.close() はconn.close()
参照してください、あなたは実際には気にしないように、プロンプトIDEで、もちろん2人の非常に長い変数名を、インポートする必要があるが、これは非常にエレガントではないように私はいつも感じて、結局、パイソンのではなく、どのようにエレガントなライン?だから我々は、別の方法を使用することができます。
インポートpsycopg2 DATABASE_NAME = ' test_classs ' DATABASE_NAME2 = ' test_classssssss ' DB_NAME = "" " CREATE DATABASE {}; """ .format(DATABASE_NAME) DB_NAME2 = "" " CREATE DATABASE {}; """ .format(DATABASE_NAME2) CONN = psycopg2.connect(... ) conn.autocommit = 真 CUR = conn.cursor() cur.execute(DB_NAME) conn.autocommit = Falseの CUR。実行(DB_NAME2) cur.close()実行(DB_NAME2) はconn.close()
効果は同じで、それは快適で、多くのではなかったことを見ましたか?
さて、今、我々はそれとは契約が存在しない場合、どのように何の作成が存在しない場合に達成するために、データベースを作成することができますか?
データベースを作成する「ではないが存在する場合は、」使用されるように、それは「MySQLの」ようにすることはできませんので、あなただけのそれは、データベースが存在する場合がある場合、それは、その存在を自動的に提出設定を作成しない場合、最初のチェックは、見て、周りに他の方法を変更することができます扱われていない、恐れ入りますが?これは、まだアイデアのためにありますか?エヘン。。まあ、考え方は変わっていないが、プロセスは、あるコードで実装されています。。具体的なコードは次のよう:
インポートpsycopg2 DATABASE_NAME = ' test_classss ' DB_NAME_EXIST = "" " 選択* pg_databaseのからdatname = '{}'; """ .format(DATABASE_NAME) DB_NAME = "" " DATABASE {}を作成します 。""" .format(DATABASE_NAME) CONN = psycopg2.connect(... ) CUR = conn.cursor() cur.execute(DB_NAME_EXIST) 結果 = cur.fetchall() であれば、結果== []: conn.autocommit = 真 CUR。実行(DB_NAME) conn.autocommit = Falseの 他: プリント(' {}は存在' .format(DATABASE_NAME)) cur.close() はconn.close()
それ以外の場合は、列「はtest_class」は存在しないエラーを報告します、ALL_DB_NAME条件のプレースホルダの後ろに、このSQL文は{}引用符で囲む必要があることに注意してください
その後、存在しないデータベースを見に切り替え、そして案の定、私はそう単純では思わなかった、問題がないように見え、それをテストします。。
conn.autocommit = 真
psycopg2.ProgrammingError:set_sessionは、トランザクション内では使用できません
、ビットBaiduの答えを見つけることができませんでしたが、文字通りの意味によると、確かに、最も愚かな方法の一つを試してみてください最初に関連する事項は、クエリログのクエリの結果である、とカーソルとの接続が閉じられ、その後、新しい接続を作成します新しいカーソル、データベース、または無治療を作成するために、結果に応じて何の問題も見つからなかった、私は奇妙な感じがするだけでなく、非常に満足して、あなたが解決策を書き留めブログに駐車したいだけ、と突然思いました、お問い合わせ後に提出するために最後はOKにではないでしょうか?迅速に直接バーコードの上に、赤面、私は直接ではなく、経験の不足だけでなく、知識データベースの欠如である理由コード、上で、非常に多くの単語を果たした理由である、泣いて、自分の愚かなことで、実際には、コードの1行を追加します。解決しました。
結果
インポートpsycopg2 DATABASE_NAME = ' test_classss ' DB_NAME_EXIST = "" " 選択* pg_databaseのからdatname = '{}'; """ .format(DATABASE_NAME) DB_NAME = "" " DATABASE {}を作成します 。""" .format(DATABASE_NAME) CONN = psycopg2.connect(... ) CUR = conn.cursor() cur.execute(DB_NAME_EXIST) conn.commit() #< -このラインADD 結果を= cur.fetchall() であれば、結果== []: CONN 。自動コミット= 真 cur.execute(DB_NAME) conn.autocommit = Falseの 他: プリント(' {}は存在している' .format(DATABASE_NAME)) cur.close() )はconn.closeを(
さて、この場所、機能実現 - 私たちは〜ありがとう、あなたは「推奨」のトラブルスポットを助けるために持っていると感じた場合、あなたは次の時間を参照してください
もちろん、あなたがよりエレガントな解決策を持っている場合は、あなたに感謝し、以下のコメントを残してください
参照
pythonを使用してPostgresデータベースを作成します。https://www.e-learn.cn/content/wangluowenzhang/448331