这个问题可能有点宽泛,但我会尝试总结我的问题。我有一个SQL文件,打开后的开头是这样的:
-- MySQL dump 10.13 Distrib 5.7.13, for Linux (x86_64)
--
-- Host: localhost Database: northwind
-- ------------------------------------------------------
-- Server version 5.7.13-0ubuntu0.16.04.2
这个标题表明这个sql文件是为Linux编写的,我猜这可能是一个重要因素,但我目前一无所知。我正在做的任务要求我使用我选择的任何编程语言创建一个应用程序来读取数据库,并为用户提供添加客户、删除订单、"发货"订单等选项。由于python是我通常使用最多、最流利的语言,我想使用python进行编程。然而,我似乎在代码中找不到读取这个SQL文件、创建DB并通过它进行工作的方法。我曾尝试过使用sqlite3,但在尝试执行或读取文件时总是遇到错误。一些尝试看起来像:
import sqlite3
from sqlite3 import OperationalError
conn = sqlite3.connect(":memory:")
c = conn.cursor()
fd = open('northwind2.sql','r')
sqlFile = fd.read()
fd.close()
sqlCommands = sqlFile.split(';')
for command in sqlCommands:
try:
c.execute(command)
except OperationalError, msg:
print("Command Skipped:", msg)
c.close()
conn.close()
这给了我一个语法错误
File "imtrying.py", line 16
except OperationalError, msg:
^
SyntaxError: invalid syntax
这可能是因为我打错了什么,但我在这里找到了一个几乎完美的例子,他们没有错误。如果我删除消息,我确实得到打印语句的多行的结果";命令已跳过:"。在继续这个尝试之后,我发现一些被跳过的行对于创建数据库至关重要,例如行:
--
-- Current Database: `northwind`
--
CREATE DATABASE /*!32312 IF NOT EXISTS*/ `northwind` /*!40100 DEFAULT CHARACTER SET latin1 */;
这是在尝试执行时跳过的第一行。另一个尝试看起来像:
import sqlite3
connection = sqlite3.connect(":memory:")
cursor = connection.cursor()
sql_file = open("northwind.sql")
sql_as_string = sql_file.read()
cursor.executescript(sql_as_string)
connection.commit()
connection.close()
这实际上进入了sql,但给了我一个错误:
Traceback (most recent call last):
File "imtrying.py", line 9, in <module>
cursor.executescript(sql_as_string)
sqlite3.OperationalError: near "DATABASE": syntax error
我希望这是我输入错误的东西,但这两个例子都是我在网上的其他例子。如有任何需要了解更多信息的提示或问题,我们将不胜感激。
except OperationalError, msg:
不是正确的python语法,请尝试
except OperationalError as msg:
您的文件是一个Mysqldump文件,它可以与mysql服务器一起使用https://gist.github.com/esperlu/943776#file-mysql2sqlite-sh。如果你想使用mysql,那么你需要先安装它,或者在替换中使用MariaDb,对于python,你可以使用https://github.com/mysql/mysql-connector-python.
这个标题表明这个sql文件是为Linux编写的,我猜这可能是一个重要因素,但我目前一无所知。
对于在Linux上运行的mysql服务器,如果是Ubuntu/Linux mysql服务器5.7.13-0ubuntu0.16.04.2版本,则意味着该文件是使用该mysql服务器版本的Ubuntu生成的。
conn=sqlite3.connect(":内存:"(
这一行创建了DB,它的操作与相同
CREATE DATABASE/!32312如果不存在/
northwind
/*!40100默认字符集latin1*/;
注意这里sqlite3使用的sintax与mysql不同,所以如果你想使用sqlite3创建一个DB,你只需要连接到它,所以在Python中它将类似于
import sqlite3
conn = sqlite3.connect("/path/northwind.db")
而在mysql中,创建数据库的命令是CREATE DATABASE northwind;在这种情况下,您需要首先恢复数据库,在mysql服务器和mysql客户端打开您的终端并键入之后
mysql -u YOUR_USER -p
source /your_path_to_dump_file.sql
之后,您可以使用python 连接到Mysql
conn = mysql.connector.connect(
host="localhost",
port=3306,
user="YOUR_USER",
password="YOUR_PASSWORD")
c = conn.cursor()
之后,您可以对数据库进行事务处理,也可以使用光标从python中获取文件,使其成为:
c.execute("source /path_to_your_file.sql")
c.commit()
注意:未测试的代码仅供参考。