首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法使用sqlite3 Python模块正确执行sql脚本

无法使用sqlite3 Python模块正确执行sql脚本
EN

Stack Overflow用户
提问于 2015-07-17 23:40:15
回答 1查看 311关注 0票数 0

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

所以我用这个小脚本打开并阅读了.sql的东西:

代码语言:javascript
复制
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脚本时,我使用的是:

代码语言:javascript
复制
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 ;

我得到了一个例外:

代码语言:javascript
复制
Command skipped:  near "unsigned": syntax error

如你所见,我的SQL不太流利:p

有人知道问题出在哪里吗?

EN

回答 1

Stack Overflow用户

发布于 2015-07-17 23:47:09

sqlite3不支持unsigned,也不支持AUTO_INCREMENT。可能还有其他一些sqlite3不支持的指令...我认为你是从某个针对postgres或mysql的人那里得到这个文件的。要修复它,请删除sqlite3不支持的所有指令,或者使用与file目标相同的数据库引擎

顺便说一句,你可以这样做

代码语言:javascript
复制
 c.executescript(open("my_sqcript.sql").read())

以下是适用于sqlite3的模式

代码语言:javascript
复制
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定义的表

代码语言:javascript
复制
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)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31479592

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档