将英文维基百科转储导入sql server

af7jpaap  于 2021-08-01  发布在  Java
关注(0)|答案(2)|浏览(226)

我已经从这里下载了最新的英文维基百科转储文件(enwiki latest pages articles multistream.xml),我正在尝试将其导入SQLServer2018。
我看不到xml文件,因为它的重量超过75GB,因此在使用批量xml之前,我不知道应该创建什么样的表。
我该怎么做?我可以用python或c#编写一些脚本。提前谢谢!

qgzx9mmu

qgzx9mmu1#

使用下列内容
创建数据库的sql查询

Create Database Feed
;
GO

USE [Feed]
drop table Doc
drop table Links
;
GO

CREATE TABLE [dbo].[Doc](
   DocID int primary key,
   Title [varchar](50) NULL,
   URL [varchar](50) NULL,
   Abstract [varchar](50) NULL
)

CREATE TABLE Links(
   DocID int, 
   LinkType [varchar](10) NULL,
   Anchor [varchar](50) NULL, 
   Link [varchar](50) NULL
   CONSTRAINT FK_DocID FOREIGN KEY (DocID)
        REFERENCES dbo.Doc (DocID)
)

从xml填充数据库的c代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
using System.Data;
using System.Data.SqlClient;

namespace ConsoleApplication1
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        const string CONNECTION_STRING = @"Server=.\SQLEXPRESS;Database=Feed;Trusted_Connection=True;";
        const string INSERT_DOC =
            "INSERT INTO [Feed].[dbo].[Doc] (" +
            "DocID, Title , URL, Abstract)" +
            " VALUES " +
            "(@DocID, @Title, @URL, @Abstract)";
        const string INSERT_LINK =
            "INSERT INTO [Feed].[dbo].[Links] (" +
            "DocID, LinkType , Anchor, Link)" +
            " VALUES " +
            "(@DocID, @Linktype, @Anchor, @Link)";

        static void Main(string[] args)
        {
            SqlConnection conn = new SqlConnection(CONNECTION_STRING);
            conn.Open();

            SqlCommand docCmd = new SqlCommand(INSERT_DOC, conn);

            docCmd.Parameters.Add("@DocID", SqlDbType.Int);
            docCmd.Parameters.Add("@Title", SqlDbType.VarChar, 50);
            docCmd.Parameters.Add("@URL", SqlDbType.VarChar, 50);
            docCmd.Parameters.Add("@Abstract", SqlDbType.VarChar, 50);

            SqlCommand linksCmd = new SqlCommand(INSERT_LINK, conn);

            linksCmd.Parameters.Add("@DocID", SqlDbType.Int);
            linksCmd.Parameters.Add("@LinkType", SqlDbType.VarChar, 10);
            linksCmd.Parameters.Add("@Anchor", SqlDbType.VarChar, 50);
            linksCmd.Parameters.Add("@Link", SqlDbType.VarChar, 50);

            XmlReader reader = XmlReader.Create(FILENAME);
            int id = 0;
            while (!reader.EOF)
            {
                if (reader.Name != "doc")
                {
                    reader.ReadToFollowing("doc");
                }
                if (!reader.EOF)
                {
                    XElement doc = (XElement)XElement.ReadFrom(reader);
                    id++;

                    docCmd.Parameters["@DocID"].Value = id;
                    docCmd.Parameters["@Title"].Value = (string)doc.Element("title");
                    docCmd.Parameters["@URL"].Value = (string)doc.Element("url");
                    docCmd.Parameters["@Abstract"].Value = (string)doc.Element("abstract");
                    int docRowsChanged = docCmd.ExecuteNonQuery();

                    foreach (XElement sublink in doc.Descendants("sublink"))
                    {
                        linksCmd.Parameters["@DocID"].Value = id;
                        linksCmd.Parameters["@LinkType"].Value = (string)sublink.Attribute("linktype");
                        linksCmd.Parameters["@Anchor"].Value = (string)sublink.Element("anchor");
                        linksCmd.Parameters["@Link"].Value = (string)sublink.Element("link");
                        int linksRowsChanged = linksCmd.ExecuteNonQuery();
                    }

                }
            }
        }
    }
}
r6hnlfcb

r6hnlfcb2#

处理此问题的最佳方法是创建一个mediawiki示例并将xml转储导入该示例,这样mediawiki就可以创建一个sql数据库,然后用于其他目的。
您可以通过从下载mediawiki来实现这一点https://mediawiki.org/wiki/download. 如果您真的需要使用microsoft sql server,我建议您下载mediawiki 1.31.8(最新的lts),因为mssql server支持在1.34中被删除(请参阅https://www.mediawiki.org/wiki/manual:microsoft(sql server)。
mediawiki服务器启动并运行后,需要运行导入脚本。最好的方法是将xml文件复制到运行wiki的服务器上,然后运行 php maintenance/importDump.php /path/to/dumpfile 从mediawiki根目录(如果您的mediawiki正在 /var/www/html/mw ,然后cd到该目录,然后运行脚本),请参阅https://www.mediawiki.org/wiki/manual:正在导入\u xml \u转储。
希望这有帮助!

相关问题