เรียกใช้ไฟล์ PostgreSQL .sql โดยใช้อาร์กิวเมนต์บรรทัดคำสั่ง


540

ฉันมีไฟล์. sql บางไฟล์ที่มีคำสั่ง INSERT หลายพันไฟล์ในนั้นและจำเป็นต้องเรียกใช้ส่วนแทรกเหล่านี้ในฐานข้อมูล PostgreSQL ของฉันเพื่อที่จะเพิ่มลงในตาราง ไฟล์มีขนาดใหญ่ที่ไม่สามารถเปิดและคัดลอกคำสั่ง INSERT ไปยังหน้าต่างแก้ไขและเรียกใช้งานที่นั่น ฉันพบบนอินเทอร์เน็ตที่คุณสามารถใช้สิ่งต่อไปนี้โดยไปที่โฟลเดอร์ bin ของการติดตั้ง PostgreSQL ของคุณ:

psql -d myDataBase -a -f myInsertFile

ในกรณีของฉัน:

psql -d HIGHWAYS -a -f CLUSTER_1000M.sql

ฉันถูกขอรหัสผ่านสำหรับผู้ใช้ของฉัน แต่ฉันไม่สามารถป้อนอะไรและเมื่อฉันกด Enter ฉันได้รับข้อผิดพลาดนี้:

psql: FATAL: การตรวจสอบรหัสผ่านล้มเหลวสำหรับผู้ใช้ "myUsername"

ทำไมมันไม่ให้ฉันใส่รหัสผ่าน มีวิธีรอบนี้หรือไม่เป็นสิ่งสำคัญที่ฉันสามารถเรียกใช้สคริปต์เหล่านี้?

ฉันได้รับปัญหานี้โดยการเพิ่มรายการใหม่ในไฟล์ pg_hba.conf ของฉันด้วยโครงสร้างต่อไปนี้:

# IPv6 local connections:
host    myDbName    myUserName ::1/128    trust

ไฟล์ pg_hba.conf สามารถพบได้ในโฟลเดอร์ 'data' ของการติดตั้ง PostgreSQL ของคุณ


6
คุณมีคำตอบแล้ว แต่ในกรณี ... "ฉันไม่สามารถป้อนอะไรก็ได้" คุณอาจพูดถึงความจริงที่ว่าการพิมพ์รหัสผ่านของคุณไม่แสดงอะไรเลย? เป็นเรื่องปกติในกรณีนี้โดยปกติการพิมพ์รหัสผ่านและการกดปุ่ม Enter ควรใช้งานได้ ...
Évelyne Lachance

ฉันมีปัญหาคล้ายกันในการติดตั้งสำเนา ITIS ( itis.gov ) ฐานข้อมูลไม่มีอยู่ดังนั้นฉันจึงไม่สามารถใช้ชื่อได้ เนื่องจากวิธีการทำงาน PostgreSQL ผมสามารถทำเช่นนี้: psql --port = 5554 --username = ราก --file = ITIS.sql template1
Cyberknight

คำตอบ:


157

คุณมีสี่ทางเลือกในการจัดหารหัสผ่าน:

  1. ตั้งค่าตัวแปรสภาพแวดล้อม PGPASSWORD สำหรับรายละเอียดดูคู่มือ:
    http://www.postgresql.org/docs/current/static/libpq-envars.html
  2. ใช้ไฟล์ .pgpass เพื่อเก็บรหัสผ่าน สำหรับรายละเอียดเพิ่มเติมโปรดดูคู่มือ:
    http://www.postgresql.org/docs/current/static/libpq-pgpass.html
  3. ใช้ "การตรวจสอบความน่าเชื่อถือ" สำหรับผู้ใช้ที่เฉพาะเจาะจง: http://www.postgresql.org/docs/current/static/auth-methods.html#AUTH-TRUST
  4. ตั้งแต่ PostgreSQL 9.1 คุณสามารถใช้สตริงการเชื่อมต่อ :
    https://www.postgresql.org/docs/current/static/libpq-connect.html#LIBPQ-CONNSTRING

สวัสดี ตอนนี้ฉันได้ตั้งค่าการไว้วางใจ แต่ฉันสังเกตเห็นว่าซอฟต์แวร์กำลังพยายามใช้ชื่อผู้ใช้ windows ของฉันเพื่อเข้าสู่ระบบ ฉันต้องการใช้บทบาทที่ฉันได้ติดตั้งในฐานข้อมูล Postgresql ของฉัน มีวิธีบอกบทบาทที่จะใช้ในการรันคำสั่งหรือไม่?
CSharpened

2
@CSharpened: ใช้-uพารามิเตอร์ตามเอกสารในคู่มือ
a_horse_with_no_name

# 2 นั้นง่ายมาก เพียงเพิ่มหนึ่งบรรทัดที่มี host: port: db: user: pass ไปยังไฟล์และคุณเสร็จแล้ว ทำได้ดีมาก
Kriil

494

แน่นอนคุณจะได้รับข้อผิดพลาดร้ายแรงสำหรับการตรวจสอบเพราะคุณไม่ได้รวมชื่อผู้ใช้ ...

ลองอันนี้ก็โอเคสำหรับฉัน :)

psql -U username -d myDataBase -a -f myInsertFile

หากฐานข้อมูลรีโมตใช้คำสั่งเดียวกันกับโฮสต์

psql -h host -U username -d myDataBase -a -f myInsertFile

4
โปรดทราบว่าชื่อผู้ใช้ที่ระบุจะต้องเป็นบทบาท postgres ที่ถูกต้อง ค่าเริ่มต้นคือผู้ใช้ที่เข้าสู่ระบบในปัจจุบัน
matthias krull

8
ทำไมต้องเป็น-aพารามิเตอร์
AlikElzin-kilaka

5
@ AlikElzin-kilaka -aไม่จำเป็นที่นี่ มันคือ "พิมพ์บรรทัดอินพุตที่ไม่ว่างเปล่าทั้งหมดไปยังเอาต์พุตมาตรฐานเมื่ออ่านแล้ว"
mjspier

นี่คือคำตอบที่ได้รับการยอมรับ
Kostanos

316

คุณควรทำเช่นนี้:

\i path_to_sql_file

ดู:

ป้อนคำอธิบายภาพที่นี่


2
ฉันได้รับPermission denied
Zac

4
หลังจากแก้ไขchmod 777 myfileข้อผิดพลาดแล้วPermission denied
Ulug'bek Ro'zimboyev

5
@Zac หากการอนุญาตของคุณถูกปฏิเสธบนเครื่อง windows คุณอาจใช้เครื่องหมายทับผิด
pgsandstrom

2
ฉันมีข้อผิดพลาดนี้บน windows และกลายเป็นเครื่องหมายทับตามที่ @ pgsandstrom พูดถึง Wrong slashes = ใช้เครื่องหมายทับซ้ายแทนและไม่มีเครื่องหมายอัญประกาศบนเส้นทาง \ ic: /dev/script.sql
เดฟ

50

ใช้สิ่งนี้เพื่อเรียกใช้ไฟล์ * .sql เมื่อเซิร์ฟเวอร์ PostgreSQL อยู่ในตำแหน่งที่ต่างกัน:

psql -h localhost -d userstoreis -U admin -p 5432 -a -q -f /home/jobs/Desktop/resources/postgresql.sql

-h PostgreSQL server IP address
-d database name
-U user name
-p port which PostgreSQL server is listening on
-f path to SQL script
-a all echo
-q quiet

จากนั้นคุณจะได้รับแจ้งให้ป้อนรหัสผ่านของผู้ใช้

แก้ไข: อัปเดตตามความคิดเห็นที่ให้บริการโดย @zwacky


5
@ ChickenWing24 -a: echo ทั้งหมด-q: เงียบ, -f: file
zwacky

อันนี้แก้ปัญหาของตัวเองได้ดี
Temi 'Topsy' Bello

45
export PGPASSWORD=<password>
psql -h <host> -d <database> -U <user_name> -p <port> -a -w -f <file>.sql

1
ฉันจะทำเช่นนั้นได้อย่างไรหากไม่มีผลลัพธ์
Lu32

2
psql -h <host> -d <database> -U <user_name> -p <port> -a -q -w -f <file> .sql
vishu9219

3
@ Lu32 คุณสามารถเว้นแฟล็ก -a ได้ (ซึ่งหมายถึง "พิมพ์บรรทัดอินพุตที่ไม่ว่างทั้งหมดไปยังเอาต์พุตมาตรฐานเมื่ออ่านแล้ว") แก้ไขโดยทดสอบโดยไม่พิมพ์ข้อมูลน้อยลง แต่ยังมีข้อมูลมากเกินไป ดังนั้นแฟล็ก -q นั้นถูกต้องตามที่ vishu9219 กล่าว
Rauni Lillemets

41

หากคุณล็อกอินเข้าสู่ psql บนเชลล์ Linux คำสั่งคือ:

\i fileName.sql

สำหรับเส้นทางที่แน่นอนและ

\ir filename.sql

สำหรับเส้นทางสัมพัทธ์จากตำแหน่งที่คุณเรียก psql


@Florian กล่าวว่าเมื่อลงชื่อเข้าใช้แล้วคุณสามารถเรียกใช้ไฟล์ได้ อย่าลืมทำเครื่องหมายบรรทัดความคิดเห็นใด ๆ ใน SQL ของคุณเป็นหนึ่งในสองวิธี ... - แสดงความคิดเห็นต่อท้ายบรรทัด a) - ความคิดเห็นหนึ่งบรรทัดหรือ b) / * ความคิดเห็นหลายบรรทัด * /
Sumit S

26

ผ่านเทอร์มินัลล็อกออนเข้าสู่ฐานข้อมูลของคุณแล้วลองทำสิ่งนี้:

database-# >@pathof_mysqlfile.sql

หรือ

database-#>-i pathof_mysqlfile.sql

หรือ

database-#>-c pathof_mysqlfile.sql

วิธีนี้มีความมั่นคงมากกว่าสำหรับฉัน ไม่ใช่คนที่ถูกทำเครื่องหมายเป็นคำตอบ
AlexG

17

คุณสามารถให้ทั้งชื่อผู้ใช้และรหัสผ่านบนบรรทัดคำสั่งเอง

   psql "dbname='urDbName' user='yourUserName' password='yourPasswd' host='yourHost'" -f yourFileName.sql

ใช้งานได้หากคุณไม่ต้องการตั้งค่าตัวแปรสภาพแวดล้อมหรือใช้ไฟล์รหัสผ่านที่แปลก =)
martin

นี่ควรเป็นคำตอบที่ได้รับการยอมรับขอบคุณ
grepit

13

คุณสามารถทำได้ด้วยวิธีนี้:

sudo -u postgres psql -d myDataBase -a -f myInsertFile

หากคุณมีsudoการเข้าถึงบนเครื่องและไม่แนะนำให้ใช้กับสคริปต์การผลิตเพียงเพื่อทดสอบกับเครื่องของคุณเองมันเป็นวิธีที่ง่ายที่สุด


9

ศึกษาวิธีการเรียกใช้ SQL บนบรรทัดคำสั่งสำหรับ PostgreSQL ใน Linux:

เปิดเทอร์มินัลและตรวจสอบให้แน่ใจว่าคุณสามารถเรียกใช้psqlคำสั่ง:

psql --version
which psql

เหมืองแร่เป็นรุ่น 9.1.6 /bin/psqlที่ตั้งอยู่ใน

สร้างไฟล์ข้อความธรรมดาที่เรียกว่า mysqlfile.sql

แก้ไขไฟล์นั้นใส่บรรทัดเดียวในนั้น:

select * from mytable;

รันคำสั่งนี้บน commandline (การแทนที่ชื่อผู้ใช้และชื่อฐานข้อมูลของคุณสำหรับ pgadmin และ kurz_prod):

psql -U pgadmin -d kurz_prod -a -f mysqlfile.sql

ต่อไปนี้เป็นผลลัพธ์ที่ฉันได้รับบนเทอร์มินัล (ฉันไม่ได้รับพร้อมท์ให้ใส่รหัสผ่าน):

select * from mytable;

test1
--------
hi
me too

(2 rows)

คุณจะตั้งค่าผู้ใช้ได้อย่างไร? นี่เป็นครั้งแรกที่ฉันติดตั้งและรัน -f ในไฟล์. sql ใหม่ มักจะพูดว่ารหัสผ่านผิด
mKane

4

คุณสามารถเปิดพรอมต์คำสั่งและเรียกใช้ในฐานะผู้ดูแลระบบ จากนั้นพิมพ์

../bin>psql -f c:/...-h localhost -p 5432 -d databasename -U "postgres"

Password for user postgres: จะปรากฏขึ้น

พิมพ์รหัสผ่านของคุณและป้อน ฉันไม่เห็นรหัสผ่านที่ฉันพิมพ์ แต่คราวนี้เมื่อฉันกด Enter จะใช้งานได้ จริงๆแล้วฉันกำลังโหลดข้อมูลลงในฐานข้อมูล


ฉันคิดว่าคุณหมายถึง-d "postgres"
แอมเฟตามาจิน

@amphetamachine -d สำหรับชื่อฐานข้อมูลตรวจสอบpsql --help
Yaz

1

ฉันรู้สึกว่าเขียนแล้ว (อยู่ในไดเรกทอรีที่สคริปต์ของฉันอยู่)

::someguy@host::$sudo -u user psql -d my_database -a -f file.sql 

ที่-u user เป็นบทบาทที่เป็นเจ้าของฐานข้อมูลที่ฉันต้องการรันสคริปต์จากนั้นpsqlเชื่อมต่อกับpsqlคอนโซลหลังจากนั้น-d my_databaseโหลดฉันในmydatabaseที่สุด-a -f file.sqlที่-aสะท้อนอินพุตทั้งหมดจากสคริปต์และ-fรันคำสั่งจากfile.sqlในmydatabaseแล้วออก

ฉันใช้: psql (PostgreSQL) 10.12 บน (Ubuntu 10.12-0ubuntu0.18.04.1)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.