【问题标题】:Cannot properly execute a sql script with sqlite3 Python module无法使用 sqlite3 Python 模块正确执行 sql 脚本
【发布时间】:2015-10-07 09:32:07
【问题描述】:

我正在尝试使用 sqlite3 Python 模块执行包含在 .sql 文件中的 SQL 脚本,以便将数据库从 Drupal 站点迁移到 Wordpress 站点。

所以我用这个小脚本打开并阅读了 .sql 文件:

def executeSQLScriptsFromFile(filename):
    fd = open(filename, 'r')
    sqlFile = fd.read()
    fd.close()

    sqlCommands = sqlFile.split(';')

    for command in sqlCommands:
        print " === BEGIN \n" + command + "\nEND === \n"
        try:
            c.execute(command)
        except OperationalError, msg:
            print "Command skipped: ", msg 

当我使用我编写的 SQL 命令执行这段代码时,一切正常:CREATE TABLE、SELECT、DELETE...

但是当我尝试使用从网站数据库下载的 SQL 脚本时:

CREATE TABLE IF NOT EXISTS `node` (
  `nid` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `vid` int(10) unsigned NOT NULL DEFAULT '0',
  `type` varchar(32) NOT NULL DEFAULT '', 
  `language` varchar(12) NOT NULL DEFAULT '', 
  `title` varchar(255) NOT NULL DEFAULT '', 
  `uid` int(11) NOT NULL DEFAULT '0',
  `status` int(11) NOT NULL DEFAULT '1',
  `created` int(11) NOT NULL DEFAULT '0',
  `changed` int(11) NOT NULL DEFAULT '0',
  `comment` int(11) NOT NULL DEFAULT '0',
  `promote` int(11) NOT NULL DEFAULT '0',
  `moderate` int(11) NOT NULL DEFAULT '0',
  `sticky` int(11) NOT NULL DEFAULT '0',
  `tnid` int(10) unsigned NOT NULL DEFAULT '0',
  `translate` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`nid`),
  UNIQUE KEY `vid` (`vid`),
  KEY `node_changed` (`changed`),
  KEY `node_created` (`created`),
  KEY `node_moderate` (`moderate`),
  KEY `node_promote_status` (`promote`,`status`),
  KEY `node_status_type` (`status`,`type`,`nid`),
  KEY `node_title_type` (`title`,`type`(4)),
  KEY `node_type` (`type`(4)),
  KEY `uid` (`uid`),
  KEY `tnid` (`tnid`),
  KEY `translate` (`translate`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=663 ;

我遇到了这个异常:

Command skipped:  near "unsigned": syntax error

如您所见,我的 SQL 并不流利:p

有人知道可能是什么问题吗?

【问题讨论】:

  • 你用的是sqlite3还是mysql?为什么这两者都被标记?基本上,sql 可能针对的是与您使用的不同的 sql 引擎 ...

标签: python mysql sql exception sqlite


【解决方案1】:

sqlite3 不支持“无符号”,也不支持 AUTO_INCREMENT。 sqlite3 可能不支持其他一些指令...我认为您从针对 postgres 或 mysql 的人那里获得了该文件...修复它删除 sqlite3 不支持的所有指令,或使用相同的数据库文件目标的引擎

顺便说一句,你可以做

 c.executescript(open("my_sqcript.sql").read())

这是适用于 sqlite3 的架构

CREATE TABLE IF NOT EXISTS `node` (
  `nid` int(10) NOT NULL,
  `vid` int(10) NOT NULL DEFAULT '0',
  `type` varchar(32) NOT NULL DEFAULT '', 
  `language` varchar(12) NOT NULL DEFAULT '', 
  `title` varchar(255) NOT NULL DEFAULT '', 
  `uid` int(11) NOT NULL DEFAULT '0',
  `status` int(11) NOT NULL DEFAULT '1',
  `created` int(11) NOT NULL DEFAULT '0',
  `changed` int(11) NOT NULL DEFAULT '0',
  `comment` int(11) NOT NULL DEFAULT '0',
  `promote` int(11) NOT NULL DEFAULT '0',
  `moderate` int(11) NOT NULL DEFAULT '0',
  `sticky` int(11) NOT NULL DEFAULT '0',
  `tnid` int(10)  NOT NULL DEFAULT '0',
  `translate` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`nid`),
  UNIQUE(`vid`)

)   ;

这是 sqlalchemy 定义的表

class Node(Base):
   __tablename__ = 'node'
   nid     = Column(Integer,primary_key=True)
   vid     = Column(Integer,default=0)
   type    = Column(String,default="")
   language= Column(String,default="")
   title   = Column(String,default="")
   uid     = Column(Integer,default=0)
   status  = Column(Integer,default=1)
   created = Column(Integer,default=0)
   changed = Column(Integer,default=0)
   comment = Column(Integer,default=0)
   promote = Column(Integer,default=0)
   moderate= Column(Integer,default=0) 
   sticky  = Column(Integer,default=0)
   tnid    = Column(Integer,default=0)
   translate= Column(Integer,default=0)

【讨论】:

  • 那么,在 Python 中使用 MySQL 脚本的最佳方式和最简单方式是什么?
  • 把它转换成类似sqlalchemy的ORM,那么它就不用关心后端引擎了,理论上你可以很容易地改变它。我认为 mysqldb 是每个人用来与 mysql 数据库通信的东西......如果你想采用为 mysql 编写的原始 sql,如果你只是想将它与 sqlite3 一起使用,它可能会损坏很多
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多