是否可以创建单个sql脚本来创建数据库并用表填充它?

时间:2015-12-06 21:55:03

标签: sql windows postgresql

当使用psql命令行工具创建数据库时,我通常做的事情(因为我之前看到它工作,我真的不知道其他任何做事方式)是:

  1. 首先创建一个新用户UCREATE USER U WITH PASSWORD 'U');
  2. 然后创建一个名为UCREATE DATABASE U);
  3. 的数据库
  4. 退出psql并使用psql -U U
  5. 重新开始
  6. 开始创建表格(CREATE TABLE T())。
  7. 这就产生了一个问题,即它对SQL脚本的效果不佳。我更喜欢只有一个.sql文件,可以在其中创建完整的数据库。这甚至可能吗?

    由于

2 个答案:

答案 0 :(得分:1)

使用这样的bash脚本:

#!/bin/bash
psqluser="U"   # username
psqlpass="U"   # password
psqldb="U"   # db

sudo printf "CREATE USER $psqluser WITH PASSWORD '$psqlpass';\nCREATE DATABASE $psqldb WITH OWNER $psqluser;\nGRANT ALL PRIVILEGES ON database $psqldb TO $psqluser;" > createdb.sql

sudo -u postgres psql -f createdb.sql

echo "Populating inserting.sql"
sudo -u postgres psql -d $psqldb -f inserting.sql

其中inserted.sql类似于:

CREATE TABLE T (
    id serial,
    description text
);


ALTER TABLE T OWNER TO U;


INSERT INTO T(description) VALUES ('description 1');
INSERT INTO T(description) VALUES ('description 2');


ALTER TABLE ONLY T ADD CONSTRAINT id_pkey PRIMARY KEY (id);

答案 1 :(得分:1)

创建用户和数据库后,可以使用\connect命令更改与新创建的数据库的连接。

create user arthur with password 'secret';
create database arthur_db owner arthur;

\connect dbname=arthur_db user=arthur password=secret

-- create the tables and populate them
create table items
(
  id serial primary key,
  item_name text
);

insert into items (item_name) values ('Towel'), ('Peanuts');

\connect特定于psql,因此上述内容仅适用于psql,而不适用于其他SQL客户端。

如果您的用户更喜欢其他SQL客户端,则最好分割数据库和用户的创建以及设置数据库表的脚本。

您仍然可以使用包含这两个脚本的单个脚本,以便使用psql的用户可以运行单个脚本。使用不同SQL客户端的用户可以手动运行这两个脚本并自行建立连接:

\i create_db_and_user.sql 
\connect dbname=arthur_db user=arthur password=secret
\i setup_tables.sql