我已经从这里下载了最新的英文维基百科转储文件(enwiki latest pages articles multistream.xml),我正在尝试将其导入SQLServer2018。我看不到xml文件,因为它的重量超过75GB,因此在使用批量xml之前,我不知道应该创建什么样的表。我该怎么做?我可以用python或c#编写一些脚本。提前谢谢!
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(); } } } } } }
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转储。希望这有帮助!
php maintenance/importDump.php /path/to/dumpfile
/var/www/html/mw
2条答案
按热度按时间qgzx9mmu1#
使用下列内容
创建数据库的sql查询
从xml填充数据库的c代码
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转储。希望这有帮助!