Дамп таблицы postgresql в файл XML

так что это относительно простой вопрос. У меня есть таблица postgresql, которую мне нужно сбросить в XML-файл на моем локальном компьютере. Я прочитал всю документацию на https://www.postgresql.org/docs/current/static/functions-xml.html и https://www.postgresql.org/docs/9.4/static/sql-copy.html, и я придумал следующую команду через командную строку psql:

COPY (SELECT table_to_xml(SELECT FROM Database public.'table', true, false, '')) to 'C:/users/me/file.xml';

Однако я продолжаю получать синтаксическую ошибку в районе «ОТ» или рядом с ним. За последний час я просмотрел каждую ссылку SO, которая выглядела полезной (Таблицы Postgresql существуют, но при запросе появляется сообщение «отношение не существует» | Невозможно просто использовать имя таблицы PostgreSQL («связь не существует») | используя копию в postgresql? | Данные Postgres в XML) и каждое видео на YouTube, которое удаленно звучало так, как мне было нужно, но безрезультатно. Я пробовал с оператором FROM и без него, пробовал с SELECT * перед FROM и т.д ... не повезло. Должно быть, мне не хватает чего-то очень простого. Любые идеи?

Можете ли вы предоставить вывод для: SELECT * FROM information_schema.tables, где table_name = 'your_table_name'

user8406805 10.05.2018 18:23

Любопытно, работает ли запрос table_to_xml() даже до копирования в текстовый файл?

Parfait 10.05.2018 18:25

@Vivek Когда я выполняю запрос SELECT * FROM information_schema.tables, где table_name = 'your_table_name' на моем PGAdmin 4, я получаю следующие результаты: Таблица с несколькими заголовками, имеющая одну строку. Заголовки: table_catalog (имя базы данных), table_schema (общедоступный), table_name (имя моей таблицы), table_type (BASE TABLE) и т. Д ... остальные равны нулю.

Graydon Neill 10.05.2018 18:43

Вместо того, чтобы давать общедоступное имя в качестве имени базы данных, введите значение, которое возвращается как база данных, это все попытки, поскольку у меня сейчас нет сеанса pg

user8406805 10.05.2018 18:49

@Vivek Итак, хорошие новости и плохие новости ... Хорошие новости: я попробовал, как вы предложили, выполнить команду COPY (SELECT table_to_xml (Database.'table ', true, false,' ')) в' C: / users / me /file.xml '; И это не дало мне ошибки ... однако файл не был создан, и, судя по моему диспетчеру задач, больше ничего не происходит.

Graydon Neill 10.05.2018 19:16

Можно ли указать другой путь к диску, например D: \ abc.csv

user8406805 10.05.2018 19:28
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
6
2 142
3

Ответы 3

Попробуйте это, похоже, синтаксис неправильный, который вы пробовали.

COPY (SELECT table_to_xml('table', true, false, '')) to 'C:/users/me/file.xml';

В качестве альтернативы вы можете попробовать:

psql -p5432 db_name \copy (SELECT table_to_xml('table', true, false, '')) TO 'C:/users/me/file.xml';

Спасибо за быстрый ответ, но я уже пробовал это. Я получаю сообщение об ошибке, что это отношение не существует, когда оно существует. Вот почему я добавил в исходный запрос часть базы данных public.'table. Если я попробую КОПИРОВАТЬ (SELECT table_to_xml (Database public.'table ', true, false,' ')) в' C: \ users \ me \ file.xml '; Я получаю синтаксическую ошибку на уровне "общедоступный" или рядом с ним

Graydon Neill 10.05.2018 17:53

Можете ли вы использовать вместо этого "public.table"

user8406805 10.05.2018 17:57

Я также добавил еще один способ сделать то же самое, используя команду «psql», это тоже работает.

user8406805 10.05.2018 18:06

Я безрезультатно попробовал оба ваших предложения. Я все еще получаю сообщение об отсутствии связи. Я трижды проверил, что он написан правильно и набран именно в том случае, если я его создал ... Я не понимаю, как он до сих пор не может найти связь. Возможно, есть какие-то настройки в инструменте PGAdmin, которые я мог бы установить, чтобы он распознал связь?

Graydon Neill 10.05.2018 18:17

ОК, так что обнови. Проведя большую часть дня в борьбе с этим, я нашел частичное решение. Используя информацию отсюда и В разрешении отказано при попытке импортировать файл CSV из PGAdmin, я смог заставить команду работать в PGAdmin 4 вроде ...

COPY (SELECT table_to_xml('table_name', true, false, '')) to 'C:\XML\Table.xml';

Вышеупомянутая команда при запуске в PGAdmin, очевидно, сделает то, что я только предполагаю, это то, что я хочу. У меня не было времени проверить, действительно ли он создает рабочий XML-файл таблицы, если я использую меньший набор данных. Тем не менее, если я следую инструкциям в ранее упомянутой ссылке и создаю папку с пустым файлом XML в ней и устанавливаю разрешения, позволяющие всем читать / записывать в папку, которую выполняет команда. Однако он использует неприличный объем памяти. Чтобы записать в XML таблицу размером всего около 2 ГБ, программа потребила все 36 ГБ моей памяти, прежде чем вылетела сама. У меня нет времени продолжать тестирование, потому что я обнаружил, что могу добраться туда, где мне нужно было использовать дамп в текстовый файл. в любом случае я надеюсь, что это кому-то поможет.

Оператор копирования у меня не работает - заканчивается оперативная память.
Однако экспорт с C# работает нормально (при этом все данные загружаются в память):

public static void DataToXML()
{
    Npgsql.NpgsqlConnectionStringBuilder csb = new Npgsql.NpgsqlConnectionStringBuilder();
    csb.Database = "YourDB";
    csb.Host = "localhost";
    csb.Port = 5432;
    csb.IntegratedSecurity = true;
    csb.Username = "postgres";
    // csb.Password = "";


    using (System.Data.DataTable dt = new System.Data.DataTable())
    {

        dt.TableName = "record";

        using (System.Data.DataSet ds = new System.Data.DataSet("geoip_blocks_temp"))
        {
            ds.Tables.Add(dt);
            // dt.Namespace = "foo";

            using (System.Data.Common.DbConnection con = Npgsql.NpgsqlFactory.Instance.CreateConnection())
            {
                con.ConnectionString = csb.ConnectionString;

                using (System.Data.Common.DbCommand cmd = con.CreateCommand())
                {
                    cmd.CommandText = "SELECT * FROM geoip.geoip_blocks_temp";

                    using (System.Data.Common.DbDataAdapter da = Npgsql.NpgsqlFactory.Instance.CreateDataAdapter())
                    {
                        da.SelectCommand = cmd;

                        if (con.State != System.Data.ConnectionState.Open)
                            con.Open();

                        da.Fill(dt);

                        if (con.State != System.Data.ConnectionState.Open)
                            con.Close();
                    } // End Using da 

                } // End Using cmd 

            } // End Using con 


            //using (System.IO.Stream fs = System.IO.File.OpenWrite(@"D:\geoip_blocks_temp.xml"))
            //{
            //    using (System.IO.TextWriter sw = new System.IO.StreamWriter(fs, System.Text.Encoding.UTF8))
            //    {
            //        // System.IO.StringWriter sw = new System.IO.StringWriter();
            //        // dt.WriteXml(sw, System.Data.XmlWriteMode.IgnoreSchema);
            //        dt.WriteXml(sw, System.Data.XmlWriteMode.IgnoreSchema);
            //    } // End Using sw 

            //} // End Using fs 


            System.Xml.XmlWriterSettings xs = new System.Xml.XmlWriterSettings();
            xs.Indent = true;
            xs.IndentChars = "    ";
            xs.NewLineChars = System.Environment.NewLine;
            xs.OmitXmlDeclaration = false;
            // xs.Encoding = System.Text.Encoding.UTF8; // doesn't work with pgsql 
            xs.Encoding = new System.Text.UTF8Encoding(false);

            // <?xml version = "1.0" encoding = "UTF-8" standalone = "yes"?>
            using (System.Xml.XmlWriter writer = System.Xml.XmlWriter.Create(@"D:\geoip_blocks_temp.xml", xs))
            {
                dt.WriteXml(writer, System.Data.XmlWriteMode.IgnoreSchema);
            }

            System.Console.WriteLine(dt.Rows.Count);
        } // End Using ds 

    } // End Using dt 

} // End Sub DataToXML 

Или более экономно память:

public static void LargeDataToXML()
{
    string table_schema = "geoip";
    string table_name = "geoip_blocks_temp";

    // table_schema = "public";
    // table_name = "t_sys_language_monthnames";


    System.Xml.XmlWriterSettings xs = new System.Xml.XmlWriterSettings();
    xs.Indent = true;
    xs.IndentChars = "    ";
    xs.NewLineChars = System.Environment.NewLine;
    xs.OmitXmlDeclaration = false; // // <?xml version = "1.0" encoding = "UTF-8" standalone = "yes"?>
    // xs.Encoding = System.Text.Encoding.UTF8; // doesn't work with pgsql 
    xs.Encoding = new System.Text.UTF8Encoding(false);

    string exportFilename = System.IO.Path.Combine(@"d:\", table_name + ".xml");

    using (System.Xml.XmlWriter writer = System.Xml.XmlWriter.Create(exportFilename, xs))
    {
        writer.WriteStartDocument();
        writer.WriteStartElement(table_name);

        writer.WriteAttributeString("xmlns", "xsi", null, System.Xml.Schema.XmlSchema.InstanceNamespace);
        // writer.WriteAttributeString("xsi", "schemaLocation", null, System.Xml.Schema.XmlSchema.InstanceNamespace);



        using (System.Data.Common.DbConnection con = Npgsql.NpgsqlFactory.Instance.CreateConnection())
        {
            con.ConnectionString = GetCS();

            using (System.Data.Common.DbCommand cmd = con.CreateCommand())
            {
                cmd.CommandText = "SELECT * FROM " + table_schema + "." + table_name;


                if (con.State != System.Data.ConnectionState.Open)
                    con.Open();

                using (System.Data.Common.DbDataReader dr = cmd.ExecuteReader(System.Data.CommandBehavior.SequentialAccess))
                {

                    if (dr.HasRows)
                    {
                        int fc = dr.FieldCount;

                        string[] columnNames = new string[fc];
                        // System.Type[] columnTypes = new System.Type[fc];

                        for (int i = 0; i < dr.FieldCount; ++i)
                        {
                            columnNames[i] = dr.GetName(i);
                            // columnTypes[i] = dr.GetFieldType(i);
                        } // Next i 

                        while (dr.Read())
                        {
                            // object[] thisRow = new object[dr.FieldCount];

                            writer.WriteStartElement("record");

                            for (int i = 0; i < fc; ++i)
                            {
                                writer.WriteStartElement(columnNames[i]);
                                object obj = dr.GetValue(i);

                                if (obj != System.DBNull.Value)
                                {
                                    writer.WriteValue(obj);
                                }
                                else
                                    writer.WriteAttributeString("xsi", "nil", System.Xml.Schema.XmlSchema.InstanceNamespace, "true");

                                writer.WriteEndElement();
                            } // Next i

                            writer.WriteEndElement();

                        } // Whend 

                    } // End if (dr.HasRows) 

                } // End Using dr 

                if (con.State != System.Data.ConnectionState.Open)
                    con.Close();
            } // End Using cmd 

        } // End Using con 

        writer.WriteEndElement();
    } // ENd Using writer 

} // End Sub LargeDataToXML 

Другие вопросы по теме