так что это относительно простой вопрос. У меня есть таблица 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 и т.д ... не повезло. Должно быть, мне не хватает чего-то очень простого. Любые идеи?
Любопытно, работает ли запрос table_to_xml() даже до копирования в текстовый файл?
@Vivek Когда я выполняю запрос SELECT * FROM information_schema.tables, где table_name = 'your_table_name' на моем PGAdmin 4, я получаю следующие результаты: Таблица с несколькими заголовками, имеющая одну строку. Заголовки: table_catalog (имя базы данных), table_schema (общедоступный), table_name (имя моей таблицы), table_type (BASE TABLE) и т. Д ... остальные равны нулю.
Вместо того, чтобы давать общедоступное имя в качестве имени базы данных, введите значение, которое возвращается как база данных, это все попытки, поскольку у меня сейчас нет сеанса pg
@Vivek Итак, хорошие новости и плохие новости ... Хорошие новости: я попробовал, как вы предложили, выполнить команду COPY (SELECT table_to_xml (Database.'table ', true, false,' ')) в' C: / users / me /file.xml '; И это не дало мне ошибки ... однако файл не был создан, и, судя по моему диспетчеру задач, больше ничего не происходит.
Можно ли указать другой путь к диску, например D: \ abc.csv


Попробуйте это, похоже, синтаксис неправильный, который вы пробовали.
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 '; Я получаю синтаксическую ошибку на уровне "общедоступный" или рядом с ним
Можете ли вы использовать вместо этого "public.table"
Я также добавил еще один способ сделать то же самое, используя команду «psql», это тоже работает.
Я безрезультатно попробовал оба ваших предложения. Я все еще получаю сообщение об отсутствии связи. Я трижды проверил, что он написан правильно и набран именно в том случае, если я его создал ... Я не понимаю, как он до сих пор не может найти связь. Возможно, есть какие-то настройки в инструменте PGAdmin, которые я мог бы установить, чтобы он распознал связь?
ОК, так что обнови. Проведя большую часть дня в борьбе с этим, я нашел частичное решение. Используя информацию отсюда и В разрешении отказано при попытке импортировать файл 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
Можете ли вы предоставить вывод для: SELECT * FROM information_schema.tables, где table_name = 'your_table_name'