22

コマンドがpsql効果を発揮していないように見えることがあります。理由はありますか?

以下は、データベース内のすべてのテーブルのリストですlibrary_development

library_development=> \d

               List of relations
 Schema |       Name        | Type  |  Owner
--------+-------------------+-------+----------
 public | Pavan             | table | postgres
 public | schema_migrations | table | sai
(2 rows)

この後、次をPavan使用してテーブルを削除しました:

library_development-> drop table Pavan

ただし、テーブルは削除されず、次のように表示されます

library_development=> \d
               List of relations
 Schema |       Name        | Type  |  Owner
--------+-------------------+-------+----------
 public | Pavan             | table | postgres
 public | schema_migrations | table | sai
(2 rows)

また:

  1. WindowsでPostgreSQLを使用しています。コンソールをクリアするコマンドはありますか (Oracle に存在する cl scr など)?

  2. DML スクリプトを操作するときに Postgresql で実行する必要がある「コミット」の概念はありますか?

4

2 に答える 2

42

ステートメントはセミコロンで終わります。

ではpsql、セミコロンなしで Enter キーを押すと、ステートメントが次の行に継続され、クエリ バッファーに書き込んだ内容が実行されるのではなく追加されます。継続行にいることを示すために、プロンプトが からdbname=>に変化することに気付くでしょう。dbname->

regress=> DROP TABLE sometable
regress-> \r
Query buffer reset (cleared).
regress=> DROP TABLE sometable;
ERROR:  table "sometable" does not exist
regress=> 

セミコロンなしで Enter キーを押すと、プロンプトが に変わりregress-#、何のアクションも実行されないことに注意してください。table がないsometableため、ステートメントが実行された場合、エラーが報告されます。

次に、\r次の行での使用を参照してください。これにより、クエリ バッファがクリアされます。regress=#部分的なステートメントがバッファリングされなくなったため、プロンプトがバッファがクリアされたときの状態に戻ることに注意してください。

これは、ステートメントを複数の行に分割する方法を示しています。

regress=> DROP TABLE
regress-> sometable
regress-> ;
ERROR:  table "sometable" does not exist

紛らわしいのは、次のpsqlようなバックスラッシュ コマンド\dは、セミコロンではなく改行で終了するため、Enter キーを押すと実行されることですこれは、ステートメントの作成中にテーブル定義を (たとえば) 表示したい場合に便利ですが、初心者にとっては少し混乱します。

追加の質問について:

  1. Windows用の「クリアスクリーン」コマンドがある場合、psql私はまだ見つけていません。Linux では、他の readline を使用するプログラムと同じように、control-L を使用します。Windows\! clsで動作します。

  2. PostgreSQL の DDL はトランザクションです。BEGINトランザクションを実行し、DDL を発行して、トランザクションを有効にすることができCOMMITます。明示的なトランザクションで DDL を実行しない場合、すぐに有効になります。

于 2012-09-18T07:26:05.093 に答える
6

似たようなものに遭遇しましたが、原因は異なっていました。

私は dropdb コマンドを使用しようとしていましたが、コマンドが何の効果もないように見えました (プロンプトの変更は、コマンドがバッファーにあることを意味しますが、ここでは問題ではありません)。

postgres=# dropdb databasename
postgres-#

dropdb などのコマンドは、psql の外側に入力する必要があります。私がしていたことは:

$ psql postgres
postgres=# dropdb databasename

最初のコマンドは Bash にあり、psql を起動し、2 番目のコマンドは psql 内で送信されることに注意してください。

正しい方法は、コマンドを bash (コンソール) で直接送信することです。

$ dropdb databasename

これが何人かの人々に役立つことを願っています。

于 2020-03-08T21:09:09.067 に答える