I have a postgres DB and I want to export all schemas, the table names and their column names without the actual data to a CSV file or something similar in text. This needs to be exported at once as there is 100s of tables in the DB. Is this possible in Postgres using pgAdmin?
I have tried to export the database but I only could come up with ways to export the names of the tables and columns with the actual data contained in them. I have not being able to export only the schemas, tables and their column names. And I wanted to export the column names for all the tables at once which I was not able to do.
pgAdmin has access to psql so:
\pset format csv
\o col_names.csv
SELECT
attrelid::regclass AS table_name,
attname AS column_name
FROM
pg_attribute pa
JOIN pg_class pc ON pa.attrelid = oid
AND relkind = 'r'
AND relnamespace NOT IN ('pg_catalog'::regnamespace, 'information_schema'::regnamespace);
\o
\! head col_names.csv
table_name,column_name
pricing_production,pricegroup
pricing_production,price_id
pricing_production,q_brk_1
pricing_production,q_brk_2
pricing_production,q_brk_3
pricing_production,q_brk_4
pricing_production,q_brk_5
pricing_production,q_brk_6
pricing_production,b_seas_1
Related
This is closely related to this question which describes how to list all tables in a schema in a postgres databank. The query select * from information_schema.tables does the job. In my case, some of the tables in the schema are partitioned and in this case the query above lists both the complete table as well as all the partitions as separate entries.
How can I get a list that only contains the full tables without the individual partitions?
For example, if the schema contains a table named 'example' which is partitioned on the column 'bla' with the two values 'a' and 'b', then information_schema.tables will have one entry for 'example' and then two additional entries 'example_part_bla_a' and 'example_part_bla_a'. I thought about doing an exclusion based on substring matches to 'part' or something like that but that makes an assumption on how the tables are named and hence would fail with some table names. There must be a better way to do this.
You won't find that information in the information_schema; you will have to query the catalogs directly:
SELECT c.relname
FROM pg_class AS c
WHERE NOT EXISTS (SELECT 1 FROM pg_inherits AS i
WHERE i.inhrelid = c.oid)
AND c.relkind IN ('r', 'p');
I have two tables in PostgreSQL and I want to join them with where condition. After I joined them, I want to convert to CSV file using copy function. Is it possible to join and generate the CSV file using COPY function? Or is it have another method?
Yes, it is possible and very easy.
Let's suppose we have two tables, merchant_position and merchant_timeline. In (mp_sc_id, mp_merchant_id, mp_rank, mp_tier, mp_updated_at), all these fields are from the merchant_position table but (mt_name) is in merchant_timeline table and foreign key is mt_id and mp_merchant_id.
\copy (select mp_sc_id, mp_merchant_id, mp_rank, mp_tier, mp_updated_at, mt_name from merchant_position INNER JOIN merchant_timeline ON mt_id = mp_merchant_id) TO '/Users/Desktop/mercahnt_rank.csv' DELIMITER ',' CSV HEADER
In Mysql workbench, I have created a model with eight tables, and about 50 columns.
is there a way to export the model (not data) into a csv?
Thanks.
You could run the following query:
SELECT * INTO OUTFILE '/path/to/model.csv'
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = 'mydb' AND TABLE_NAME = 'mytable'
You can find some more information about the COLUMNS table here.
The use case is, say you have a table with a lot of columns (100+) and you want to see if a certain column name exists in the table. Another use case is, say there is a name scheme for the columns in the table that allows me to search for a term that will show all fields with that name - e.g. all fields related to a payment card are prefixed with "card_".
In MySQL I could handle both cases above by doing a show fields in <table_name> like '%<search_term>%'. I've googled for a solution but have only found results related to filtering actual table names and showing table schemas (e.g. \d+), which is not what I am looking for. I've also tried variations of the MySQL command in the psql shell, but no luck.
I'm looking for a way to do this with SQL or with some other Postgres built-in way. Right now I'm resorting to copying the table schema to a text file and searching through it that way.
You can query information_schema.columns using table_name and column_name. For example:
>= select table_name, column_name
from information_schema.columns
where table_name = 'users'
and column_name like '%password%';
table_name | column_name
------------+------------------------
users | encrypted_password
users | reset_password_token
users | reset_password_sent_at
I have a PostgreSQL database table with 4 columns - labeled column_a, column_b, etc. I want to query this table with a simple select query:
select * from table_name;
I get a handful of results looking like:
column_a | column_b
---------+---------
'a value'|'b_value'
But when I use this query:
select * from schema_name.table_name;
I get the full result:
column_a | column_b | column_c | column_d
---------+----------+----------+---------
'a value'|'b value' |'c value' |'d_value'
Columns c and d were added at a later date, after initial table creation. My question is: Why would the database ignore the later columns when the schema name is left out of the select query?
Table names are not unique within a database in Postgres. There can be any number of tables named 'table_name' in different schemas - including the temporary schema, which always comes first unless you explicitly list it after other schemas in the search_path. Obviously, there are multiple tables named table_name. You must understand the role of the search_path to interpret this correctly:
How does the search_path influence identifier resolution and the "current schema"
The first table lives in a schema that comes before schema_name in your search_path (or schema_name is not listed there at all). So the unqualified table name is resolved to this table (or view). Check the list of tables named 'table_name' that your current role has access to in your database:
SELECT *
FROM information_schema.tables
WHERE table_name = 'table_name';
Views are just special tables with an attached RULE internally. They could play the same role as a regular table and are included in the above query.
Details:
How to check if a table exists in a given schema