我已经从here下载了最新的英语维基百科转储(enwiki-latest-pages-articles-multistream.xml),并且正在尝试将其导入SQL Server 2018。
我看不到XML文件,因为它的重量超过75 GB,因此我不知道在使用Bulk XML之前应该创建哪种表。
我该怎么做?我可以在 Python 或 C#上编写一些脚本。预先感谢!
使用以下内容
用于创建数据库的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)
)
c#代码从xml填充数据库
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",50);
docCmd.Parameters.Add("@Abstract",50);
SqlCommand linksCmd = new SqlCommand(INSERT_LINK,conn);
linksCmd.Parameters.Add("@DocID",SqlDbType.Int);
linksCmd.Parameters.Add("@LinkType",10);
linksCmd.Parameters.Add("@Anchor",50);
linksCmd.Parameters.Add("@Link",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();
}
}
}
}
}
}
,
处理此问题的最佳方法是创建一个MediaWiki实例并将XML转储导入该实例,然后使MediaWiki创建一个SQL数据库,然后将其用于其他用途。
您可以通过从https://mediawiki.org/wiki/Download下载MediaWiki来实现。如果您确实需要使用Microsoft SQL Server,建议您下载MediaWiki 1.31.8(最新的LTS),因为MSSQL Server支持已在1.34中删除(请参见https://www.mediawiki.org/wiki/Manual:Microsoft_SQL_Server)。
一旦MediaWiki服务器启动并运行,您需要运行导入脚本。最好的方法是将XML文件复制到运行Wiki的服务器上,然后从MediaWiki根目录运行php maintenance/importDump.php /path/to/dumpfile
(如果您的MediaWiki在/var/www/html/mw
中运行,则cd到该目录,然后运行脚本),请参见https://www.mediawiki.org/wiki/Manual:Importing_XML_dumps。
希望这会有所帮助!