PgRoutiner é um conjunto de ferramentas de linha de comando para bancos de dados PostgreSQL e projetos PostgreSQL .NET.
Usando sua sequência de conexão do projeto de configuração .NET (ou conexão personalizada) - você pode:
Navegue e pesquise no banco de dados com facilidade.
Gere modelos e codificadores C# e TS.
Gere scripts de banco de dados e execute ferramentas.
Gerar documentação de remarca.
Gerar funções de comando CRUD.
Veja os slides de apresentação
Veja o blog PGROUTINE
Veja o blog conceitual do PGROUTINE
Consulte o blog de gerenciamento de banco de dados PGROUTINER
Veja o blog de código-gene do PGRoutiner
Veja o blog de documentação do PGRoutiner
Nota: Todos os exemplos deste ReadMe, bem como na apresentação acima, usam o banco de dados de amostra PostGresql do [tutorial PostGresql]
Início rápido:
- Faça o download de arquivos executáveis nativos (não dependente de qualquer estrutura) para a versão mais recente da página de lançamentos.
- Defina o caminho apropriado para o arquivo executável baixado.
- Digite
pgroutiner --info- NOTA: Trabalhar com executáveis nativos é muitas vezes mais rápido, eles são muito curtos no tempo de inicialização e oferecem muitas vezes melhor experiência do usuário.
Índice:
Esta é a maneira mais rápida e fácil de começar com a ferramenta PGROUTINE. A página de lançamentos contém executáveis para download que não dependem de nada. Nenhuma estrutura ou docker é necessário, apenas um executivo nativo antigo.
Na verdade, essa é a maneira preferível de usar a ferramenta PGROUTINE. Os executáveis nativos são muito otimizados e têm um tempo de inicialização muito curto e oferece muitas vezes melhor experiência do usuário.
Aqui estão as etapas:
pgroutiner --info para ver f Funciona.É isso.
Para instalar uma ferramenta global (recomendada):
$ dotnet tool install --global dotnet-pgroutiner
Tool 'dotnet-pgroutiner' (version '5.4.0') was successfully installed.Para atualizar uma ferramenta global:
$ dotnet tool update --global dotnet-pgroutiner
Tool 'dotnet-pgroutiner' was successfully updated from version '5.0.7' to version '5.0.8'. Isso permitirá uma ferramenta de linha de comando global pgroutiner . Tente digitar pgroutiner --help .
Para adicionar uma ferramenta local ao seu projeto, apenas você precisa criar um arquivo de manifesto e adicionar uma ferramenta sem interruptor --global conforme descrito neste tutorial.
TL-DR:
Adicione o diretório .config ao seu projeto ou solução.
Adicione o arquivo dotnet-tools.json a este diretório com o seguinte conteúdo:
{
"version" : 1 ,
"isRoot" : true ,
"tools" : {
"dotnet-pgroutiner" : {
"version" : " 5.0.6 " ,
"commands" : [
" pgroutiner "
]
}
}
} Do seu tipo de linha de comando, tipo dotnet tool restore
Execute a ferramenta com dotnet tool run pgroutiner [arguments] , por exemplo, dotnet tool run pgroutiner --help
pgroutiner (consulte as instruções acima)pgroutiner --help para ver comandos e switches disponíveis (a lista é longa).pgroutiner para definir uma nova conexão se você não tiver um - e para criar o arquivo de configuração padrão para este dir. Veja mais sobre gerenciamento de conexãopgroutiner --info para ver se você pode se conectar ao banco de dados e ver outras informações do ambiente.pgroutiner --list para ver a lista de todos os objetos.pgroutiner --ddl [object_name] para ver o idioma de definição de dados para o objeto do segundo parâmetro.pgroutiner --search [search expression] para pesquisar definições de dados com expressão de pesquisa. O pgroutiner foi projetado para ser executado no .NET Project Root - e lerá as conexões disponíveis dos arquivos JSON Standard Configuration (como appsettings.Development.json e appsettings.json , nessa ordem).
Ele usará a primeira string de conexão disponível na seção ConnectionStrings :
AppSsettings.json
{
"ConnectionStrings" : {
"DvdRental" : " Server=localhost;Db=dvdrental;Port=5432;User Id=postgres;Password=postgres; "
}
} NOTA: Este é o formato NPGSQL Connection String, mas também pode usar o formato de conexão PostGresql URL postgresql://{user}:{password}@{server}:{port}/{database} .
Executando o comando de informações simples para testar a conexão para ver o ambiente:
~$ pgroutiner --info
Version:
5.0.3.0
Executable dir:
/home/vbilopav/.dotnet/tools
OS:
Unix 5.10.102.1
Using configuration files:
appsettings.Development.json
appsettings.json
Using dir:
/home/vbilopav/dev/dvdrental
Using settings:
--info
Using connection DvdRental:
Host=localhost;Database=dvdrental;Port=5432;Username=postgres (PostgreSQL 13.8)
Using project file:
dvdrental.csproj
pg_dump:
pg_dump
pg_restore:
/usr/lib/postgresql/13/bin/pg_restore ~$ pgroutiner
Connection server [localhost]:
Connection port [5432]:
Connection database [postgres]:
Connection user [postgres]:
Connection password [environment var.]:-c ou -Parâmetro --connection : ~$ pgroutiner -c ConnectionString2 --info ~$ pgroutiner --connection ConnectionString2 --info Connection server [localhost]:
Connection port [5432]:
Connection database [postgres]:
Connection user [postgres]:
Connection password: Servidor de conexão, porta, banco de dados e usuário têm valores padrão predefinidos ( localhost , 5432 , postgres , postgres ) - pressione Enter para pular e usar o padrão.
A linha de comando pode usar a sequência de conexão inteira com -c ou --connection -em vez do nome da conexão:
~$ pgroutiner --connection "Server=localhost;Db=test;Port=5432;User Id=postgres;Password=postgres;" --infopostgresql://{user}:{password}@{server}:{port}/{database} - em vez de npgsql conexão string: {
"ConnectionStrings" : {
"TestConnection" : " postgresql://postgres:postgres@localhost:5432/test "
}
} ~$ pgroutiner --connection "postgresql://postgres:postgres@localhost:5432/test" --infoCada parte da conexão (servidor, porta, banco de dados, usuário e senha) pode ser omitida na sequência de conexão ou URL da conexão e será substituída pelas seguintes variáveis de ambiente:
PGHOST ou PGSERVER para substituir o parâmetro de servidor ausente.
PGPORT para substituir o parâmetro da porta ausente.
PGDATABASE ou PGDB para substituir o parâmetro de banco de dados ausente.
PGHOST ou PGSERVER para substituir o parâmetro de servidor ausente.
PGUSER para substituir o parâmetro do usuário ausente.
PGPASSWORD ou PGPASS para substituir o parâmetro de senha ausente.
Toda opção e switch de linha de comando possíveis podem ser configurados no arquivo de configuração.
Use a seção Configuração PgRoutiner na configuração JSON ( appsettings.json ou appsettings.Development.json ), Exemplo:
{
"ConnectionStrings" : {
"TestConnection" : " postgresql://postgres:postgres@localhost:5432/test "
},
"PgRoutiner" : {
// pgroutiner settings
}
} pgroutiner lerá e aplicará as definições de configuração como o valor padrão se houver a seção de configuração PgRoutiner .
Use a linha de comando para substituir qualquer definição de configuração.
Como regra geral, qualquer definição de configuração tem seu equivalente na linha de comando como o sitch de kebab, começando com dois traços. Exemplos:
SkipConnectionPrompt , Linha de comando: --skip-connection-promptSchemaSimilarTo , linha de comando: --schema-similar-to Muitas configurações também possuem alias de atalho, por exemplo, a configuração Connection pode ser: -c -conn --conn -connection --connection .
As configurações booleanas são interruptores, é pgroutiner --skip-connection-prompt
Adicione false ou 0 para desligá-lo: pgroutiner --skip-connection-prompt false
Você pode inspecionar as configurações aplicadas atualmente com --settings Switch. pgroutiner --settings forçarão a pular qualquer operação e exibirá apenas todas as configurações atuais. Ele também exibirá alias de linha de comando nos cabeçalhos de comentários.
Você também pode executar pgroutiner --info que, entre outras coisas, exibirá as configurações aplicadas atualmente que diferem dos valores padrão.
Se não houver uma seção de configuração que PgRoutiner esteja presente em qualquer lugar e, se você executar pgroutiner sem parâmetros, você será oferecido para criar o arquivo de configuração padrão appsettings.PgRoutiner.json :
You don't seem to be using any available command-line commands and PgRoutiner configuration seems to be missing.
Would you like to create a custom settings file "appsettings.PgRoutiner.json" with your current values?
This settings configuration file can be used to change settings for this directory without using a command-line.
Create "appsettings.PgRoutiner.json" in this dir [Y/N]? appsettings.PgRoutiner.json , se existir, sempre será carregado após o appsettings.json e appsettings.Development.json e substituirá quaisquer possíveis valores de configuração nesses arquivos.
Se você precisar carregar esses arquivos de configuração de um local diferente, você pode usar --config-path, for example, PGroutiner -config-path ../../dir2/
Você também pode usar qualquer uma dessas opções para carregar arquivos de configuração personalizados: -cf , --cf , -config , --config , -config-file , --- --config-file , por exemplo, pgroutiner --config ../../dir2/my-config.json
Você também pode escrever as configurações atuais em uma configuração personalizada usando qualquer uma dessas opções -wcf , --write-config-file , por exemplo, pgroutiner --write-config-file ../../dir2/my-config.json
O arquivo de configuração completo com todos os valores padrão para esta versão atual
Descrição: -l -ls --ls --list to dump or search object list to console. Use the switch to dump all objects or parameter values to search.
Exemplos:
vbilopav@DESKTOP-O3A6QK2:~/dev/dvdrental $ pgroutiner --list
SCHEMA public
EXTENSION plpgsql
TYPE mpaa_rating
DOMAIN public.year
TABLE public.actor
VIEW public.actor_info
VIEW public.customer_list
... vbilopav@DESKTOP-O3A6QK2:~/dev/dvdrental $ pgroutiner -l
SCHEMA public
EXTENSION plpgsql
TYPE mpaa_rating
DOMAIN public.year
TABLE public.actor
VIEW public.actor_info
VIEW public.customer_list
... vbilopav@DESKTOP-O3A6QK2:~/dev/dvdrental $ pgroutiner -ls
SCHEMA public
EXTENSION plpgsql
TYPE mpaa_rating
DOMAIN public.year
TABLE public.actor
VIEW public.actor_info
VIEW public.customer_list
... vbilopav@DESKTOP-O3A6QK2:~/dev/dvdrental $ pgroutiner --list film
VIEW public.film_list
VIEW public.nicer_but_slower_film_list
VIEW public.sales_by_film_category
TABLE public.film_actor
TABLE public.film_category
TABLE public.film
SEQ public.film_film_id_seq
FUNCTION public.film_in_stock(integer, integer)
FUNCTION public.film_not_in_stock(integer, integer)
vbilopav@DESKTOP-O3A6QK2:~/dev/dvdrental $ vbilopav@DESKTOP-O3A6QK2:~/dev/dvdrental $ pgroutiner --list actor
TABLE public.actor
VIEW public.actor_info
TABLE public.film_actor
SEQ public.actor_actor_id_seq
vbilopav@DESKTOP-O3A6QK2:~/dev/dvdrental $ Descrição: -def -ddl --ddl -definition --definition to dump object schema definition in console supplied as a value parameter.
Exemplos:
vbilopav@DESKTOP-O3A6QK2:~/dev/dvdrental $ pgroutiner -ddl actor
--
-- Table: public.actor
--
CREATE TABLE public.actor (
actor_id integer DEFAULT nextval('public.actor_actor_id_seq'::regclass) NOT NULL PRIMARY KEY,
first_name character varying(45) NOT NULL,
last_name character varying(45) NOT NULL,
last_update timestamp without time zone DEFAULT now() NOT NULL
);
ALTER TABLE public.actor OWNER TO postgres;
CREATE INDEX idx_actor_last_name ON public.actor USING btree (last_name);
CREATE TRIGGER last_updated BEFORE UPDATE ON public.actor FOR EACH ROW EXECUTE FUNCTION public.last_updated();
vbilopav@DESKTOP-O3A6QK2:~/dev/dvdrental $ vbilopav@DESKTOP-O3A6QK2:~/dev/dvdrental $ pgroutiner -ddl film
--
-- Table: public.film
--
CREATE TABLE public.film (
film_id integer DEFAULT nextval('public.film_film_id_seq'::regclass) NOT NULL PRIMARY KEY,
title character varying(255) NOT NULL,
description text,
release_year public.year,
language_id smallint NOT NULL,
rental_duration smallint DEFAULT 3 NOT NULL,
rental_rate numeric(4,2) DEFAULT 4.99 NOT NULL,
length smallint,
replacement_cost numeric(5,2) DEFAULT 19.99 NOT NULL,
rating public.mpaa_rating DEFAULT 'G'::public.mpaa_rating,
last_update timestamp without time zone DEFAULT now() NOT NULL,
special_features text[],
fulltext tsvector NOT NULL,
FOREIGN KEY (language_id) REFERENCES public.language(language_id) ON UPDATE CASCADE ON DELETE RESTRICT
);
ALTER TABLE public.film OWNER TO postgres;
CREATE INDEX film_fulltext_idx ON public.film USING gist (fulltext);
CREATE INDEX idx_fk_language_id ON public.film USING btree (language_id);
CREATE INDEX idx_title ON public.film USING btree (title);
CREATE TRIGGER film_fulltext_trigger BEFORE INSERT OR UPDATE ON public.film FOR EACH ROW EXECUTE FUNCTION tsvector_update_trigger('fulltext', 'pg_catalog.english', 'title', 'description');
CREATE TRIGGER last_updated BEFORE UPDATE ON public.film FOR EACH ROW EXECUTE FUNCTION public.last_updated();
vbilopav@DESKTOP-O3A6QK2:~/dev/dvdrental $ vbilopav@DESKTOP-O3A6QK2:~/dev/dvdrental $ pgroutiner --ddl film_in_stock
--
-- Function: public.film_in_stock
--
CREATE FUNCTION public.film_in_stock(
p_film_id integer,
p_store_id integer,
OUT p_film_count integer
)
RETURNS SETOF integer
LANGUAGE sql
AS $_$
SELECT inventory_id
FROM inventory
WHERE film_id = $1
AND store_id = $2
AND inventory_in_stock(inventory_id);
$_$;
ALTER FUNCTION public.film_in_stock(p_film_id integer, p_store_id integer, OUT p_film_count integer) OWNER TO postgres;
vbilopav@DESKTOP-O3A6QK2:~/dev/dvdrental $ vbilopav@DESKTOP-O3A6QK2:~/dev/dvdrental $ pgroutiner --ddl " actor;film_in_stock "
--
-- Table: public.actor
--
CREATE TABLE public.actor (
actor_id integer DEFAULT nextval('public.actor_actor_id_seq'::regclass) NOT NULL PRIMARY KEY,
first_name character varying(45) NOT NULL,
last_name character varying(45) NOT NULL,
last_update timestamp without time zone DEFAULT now() NOT NULL
);
ALTER TABLE public.actor OWNER TO postgres;
CREATE INDEX idx_actor_last_name ON public.actor USING btree (last_name);
CREATE TRIGGER last_updated BEFORE UPDATE ON public.actor FOR EACH ROW EXECUTE FUNCTION public.last_updated();
--
-- Function: public.film_in_stock
--
CREATE FUNCTION public.film_in_stock(
p_film_id integer,
p_store_id integer,
OUT p_film_count integer
)
RETURNS SETOF integer
LANGUAGE sql
AS $_$
SELECT inventory_id
FROM inventory
WHERE film_id = $1
AND store_id = $2
AND inventory_in_stock(inventory_id);
$_$;
ALTER FUNCTION public.film_in_stock(p_film_id integer, p_store_id integer, OUT p_film_count integer) OWNER TO postgres;
vbilopav@DESKTOP-O3A6QK2:~/dev/dvdrental $ Descrição: s --s --search to search object schema definitions and dump highlighted results to the console.
Pesquisa definições e despejos inteiros para consolar definições inteiras contendo a expressão.
Nota: A correspondência de expressão de pesquisa é destacada.
vbilopav@DESKTOP-O3A6QK2:~/dev/dvdrental $ pgroutiner --search " select public.group_concat "
--
-- View: public.actor_info
--
CREATE VIEW public.actor_info AS
SELECT a.actor_id,
a.first_name,
a.last_name,
public.group_concat(DISTINCT (((c.name)::text || ': '::text) || ( SELECT public.group_concat((f.title)::text) AS group_concat
FROM ((public.film f
JOIN public.film_category fc_1 ON ((f.film_id = fc_1.film_id)))
JOIN public.film_actor fa_1 ON ((f.film_id = fa_1.film_id)))
WHERE ((fc_1.category_id = c.category_id) AND (fa_1.actor_id = a.actor_id))
GROUP BY fa_1.actor_id))) AS film_info
FROM (((public.actor a
LEFT JOIN public.film_actor fa ON ((a.actor_id = fa.actor_id)))
LEFT JOIN public.film_category fc ON ((fa.film_id = fc.film_id)))
LEFT JOIN public.category c ON ((fc.category_id = c.category_id)))
GROUP BY a.actor_id, a.first_name, a.last_name;
ALTER TABLE public.actor_info OWNER TO postgres;
vbilopav@DESKTOP-O3A6QK2:~/dev/dvdrental $ vbilopav@DESKTOP-O3A6QK2:~/dev/dvdrental $ pgroutiner --search smallint
--
-- Table: public.store
--
CREATE TABLE public.store (
store_id integer DEFAULT nextval('public.store_store_id_seq'::regclass) NOT NULL PRIMARY KEY,
manager_staff_id smallint NOT NULL,
address_id smallint NOT NULL,
last_update timestamp without time zone DEFAULT now() NOT NULL,
FOREIGN KEY (address_id) REFERENCES public.address(address_id) ON UPDATE CASCADE ON DELETE RESTRICT,
FOREIGN KEY (manager_staff_id) REFERENCES public.staff(staff_id) ON UPDATE CASCADE ON DELETE RESTRICT
);
ALTER TABLE public.store OWNER TO postgres;
CREATE UNIQUE INDEX idx_unq_manager_staff_id ON public.store USING btree (manager_staff_id);
CREATE TRIGGER last_updated BEFORE UPDATE ON public.store FOR EACH ROW EXECUTE FUNCTION public.last_updated();
--
-- Table: public.address
--
CREATE TABLE public.address (
address_id integer DEFAULT nextval('public.address_address_id_seq'::regclass) NOT NULL PRIMARY KEY,
address character varying(50) NOT NULL,
address2 character varying(50),
district character varying(20) NOT NULL,
city_id smallint NOT NULL,
postal_code character varying(10),
phone character varying(20) NOT NULL,
last_update timestamp without time zone DEFAULT now() NOT NULL,
CONSTRAINT fk_address_city FOREIGN KEY (city_id) REFERENCES public.city(city_id)
);
... Dependendo do comando, essa ferramenta iniciará processos externos com ferramentas de cliente PostgreSQL como psql , pg_dump ou pg_restore .
Isso significa que as ferramentas do cliente PostGresql devem ser instaladas no sistema. As ferramentas do cliente PostgreSQL serão instaladas por padrão a cada instalação do PostGresql.
Se você não deseja um servidor, mas apenas as ferramentas do cliente:
postgresql-client seria suficiente, algo como $ sudo apt-get install -y postgresql-client , mas depende do sistema. Quando pgroutiner chama uma ferramenta externa, ele primeiro tentará chamar o alias padrão psql ou pg_dump . Então, se a versão da ferramenta não corresponder à versão da conexão, ela tentará localizar o executável no local padrão:
C:Program FilesPostgreSQL{0}binpg_dump.exe e C:Program FilesPostgreSQL{0}binpsql.exe para sistemas Windows./usr/lib/postgresql/{0}/bin/pg_dump e /usr/lib/postgresql/{0}/bin/psql para sistemas Linux.{0} é o número principal da versão.Esses caminhos são os binários do PostgreSQL instalam binários por padrão.
Quando o PGRoutiner vê a incompatibilidade da versão, ele solicitará um aviso e fallback para esse caminho com um número de versão apropriado.
Esse comportamento pode ser evitado com o Configurações de PgDumpFallback e PsqlFallback , respectivamente.
Este é um software de código aberto desenvolvido e mantido livremente sem qualquer compensação.
Copyright (C) Vedran Bilopavlović - Software VB Consulting e VB 2020 Este código -fonte é licenciado sob a licença do MIT.