将SQLite3迁移到MySQL的快速简便方法?[关闭]


Answers:


62

以下是转换器的列表(自2011年以来未更新):


一种很好的工作方式,但很少有人提及,它是:使用ORM类为您抽象出特定的数据库差异。例如,您可以通过PHP(RedBean),Python(Django的ORM层,StormSqlAlchemy),Ruby on Rails(ActiveRecord),可可(CoreData)获得这些

即你可以这样做:

  1. 使用ORM类从源数据库加载数据。
  2. 将数据存储在内存中或序列化到磁盘。
  3. 使用ORM类将数据存储到目标数据库中。

107

每个人似乎都从几个粗俗的东西和perl表达式开始,您有点儿得到了适用于您的特定数据集的东西,但是您不知道它是否正确导入了数据。令我惊讶的是,没人能建立一个可以在两者之间转换的可靠库。

这里列出了我所知道的两种文件格式在SQL语法上的所有差异:以下列开头的行:

  • 开始交易
  • 承诺
  • sqlite_sequence
  • 创建唯一索引

在MySQL中不使用

  • SQLlite使用CREATE TABLE/INSERT INTO "table_name"和MySQL使用CREATE TABLE/INSERT INTO table_name
  • MySQL在架构定义中不使用引号
  • MySQL在INSERT INTO子句中对字符串使用单引号
  • SQLlite和MySQL具有在INSERT INTO子句中转义字符串的不同方法
  • SQLlite使用't''f'表示布尔值,MySQL使用10((当您的字符串中包含“我愿意,但不要”时,一个简单的正则表达式可能会失败INSERT INTO
  • SQLLite使用AUTOINCREMENT,MySQL使用AUTO_INCREMENT

这是一个非常基本的hacked perl脚本,适用于我的数据集,并检查了我在网络上发现的其他perl脚本的更多这些条件。Nu guarentees,它将为您的数据工作,但随时可以修改并在此处发布。

#! /usr/bin/perl

while ($line = <>){
    if (($line !~  /BEGIN TRANSACTION/) && ($line !~ /COMMIT/) && ($line !~ /sqlite_sequence/) && ($line !~ /CREATE UNIQUE INDEX/)){

        if ($line =~ /CREATE TABLE \"([a-z_]*)\"(.*)/i){
            $name = $1;
            $sub = $2;
            $sub =~ s/\"//g;
            $line = "DROP TABLE IF EXISTS $name;\nCREATE TABLE IF NOT EXISTS $name$sub\n";
        }
        elsif ($line =~ /INSERT INTO \"([a-z_]*)\"(.*)/i){
            $line = "INSERT INTO $1$2\n";
            $line =~ s/\"/\\\"/g;
            $line =~ s/\"/\'/g;
        }else{
            $line =~ s/\'\'/\\\'/g;
        }
        $line =~ s/([^\\'])\'t\'(.)/$1THIS_IS_TRUE$2/g;
        $line =~ s/THIS_IS_TRUE/1/g;
        $line =~ s/([^\\'])\'f\'(.)/$1THIS_IS_FALSE$2/g;
        $line =~ s/THIS_IS_FALSE/0/g;
        $line =~ s/AUTOINCREMENT/AUTO_INCREMENT/g;
        print $line;
    }
}


我添加了完整的python脚本(仅perl脚本对我而言不起作用...需要一些额外的处理才能处理外键和索引)
Jiaaro


2
COMMITCREATE UNIQUE INDEX是有效的MySQL命令,请对其进行修复。
niutech

5
我了解您的脚本“很快又很脏”,但也非常有用,因此这里有一些补充/错误修正:* && ($line !~ /CREATE UNIQUE INDEX/)添加后&& ($line !~ /PRAGMA foreign_keys=OFF/) *表名匹配的正则表达式会丢失数字,也就是说,$line =~ /INSERT INTO \"([a-z_]*)\"(.*)/必须存在,$line =~ /INSERT INTO \"([a-z_1-9]*)\"(.*)/ 希望这对将来有所帮助读者
米哈尔莱昂

50

这是一个Python脚本,它是基于Shalmanese的回答以及Alex martelli在将Perl转换为Python时提供的一些帮助而构建的

我正在将其设为社区Wiki,所以请随时进行编辑和重构,只要它不会破坏功能(幸好我们可以回滚)-相当难看,但是可以

像这样使用(假设脚本被称为dump_for_mysql.py

sqlite3 sample.db .dump | python dump_for_mysql.py > dump.sql

然后可以将其导入mysql

注意-您需要手动添加外键约束,因为sqlite实际上并不支持它们

这是脚本:

#!/usr/bin/env python

import re
import fileinput

def this_line_is_useless(line):
    useless_es = [
        'BEGIN TRANSACTION',
        'COMMIT',
        'sqlite_sequence',
        'CREATE UNIQUE INDEX',
        'PRAGMA foreign_keys=OFF',
    ]
    for useless in useless_es:
        if re.search(useless, line):
            return True

def has_primary_key(line):
    return bool(re.search(r'PRIMARY KEY', line))

searching_for_end = False
for line in fileinput.input():
    if this_line_is_useless(line):
        continue

    # this line was necessary because '');
    # would be converted to \'); which isn't appropriate
    if re.match(r".*, ''\);", line):
        line = re.sub(r"''\);", r'``);', line)

    if re.match(r'^CREATE TABLE.*', line):
        searching_for_end = True

    m = re.search('CREATE TABLE "?(\w*)"?(.*)', line)
    if m:
        name, sub = m.groups()
        line = "DROP TABLE IF EXISTS %(name)s;\nCREATE TABLE IF NOT EXISTS `%(name)s`%(sub)s\n"
        line = line % dict(name=name, sub=sub)
    else:
        m = re.search('INSERT INTO "(\w*)"(.*)', line)
        if m:
            line = 'INSERT INTO %s%s\n' % m.groups()
            line = line.replace('"', r'\"')
            line = line.replace('"', "'")
    line = re.sub(r"([^'])'t'(.)", "\1THIS_IS_TRUE\2", line)
    line = line.replace('THIS_IS_TRUE', '1')
    line = re.sub(r"([^'])'f'(.)", "\1THIS_IS_FALSE\2", line)
    line = line.replace('THIS_IS_FALSE', '0')

    # Add auto_increment if it is not there since sqlite auto_increments ALL
    # primary keys
    if searching_for_end:
        if re.search(r"integer(?:\s+\w+)*\s*PRIMARY KEY(?:\s+\w+)*\s*,", line):
            line = line.replace("PRIMARY KEY", "PRIMARY KEY AUTO_INCREMENT")
        # replace " and ' with ` because mysql doesn't like quotes in CREATE commands 
        if line.find('DEFAULT') == -1:
            line = line.replace(r'"', r'`').replace(r"'", r'`')
        else:
            parts = line.split('DEFAULT')
            parts[0] = parts[0].replace(r'"', r'`').replace(r"'", r'`')
            line = 'DEFAULT'.join(parts)

    # And now we convert it back (see above)
    if re.match(r".*, ``\);", line):
        line = re.sub(r'``\);', r"'');", line)

    if searching_for_end and re.match(r'.*\);', line):
        searching_for_end = False

    if re.match(r"CREATE INDEX", line):
        line = re.sub('"', '`', line)

    if re.match(r"AUTOINCREMENT", line):
        line = re.sub("AUTOINCREMENT", "AUTO_INCREMENT", line)

    print line,

2
吉姆,您好:在我的数据集上,每个第一个INSERT语句都用反引号而不是单引号引起来:__ DROP TABLE IF EXISTS schema_migrations; 如果不存在则创建表schema_migrationsversionvarchar(255)NOT NULL);INSERT INTO schema_migrations VALUES(20100714032840); 插入到schema_migrations VALUES('20100714033251'); __
大卫2010年

很好...它没有显示在上方,但是反引号出现在值内部([HERE] 20100714032840 [/ HERE])
David

1
Mysql中的AUTOINCREMENT是AUTO_INCREMENT。该脚本不能解决这个问题。
giuseppe

这不适用于媒体Wiki数据库。许多错误:Blobvar数据类型,CREATE语句中的
倒钩

1
不起作用。可能不是所有条件都考虑在内了……
Himanshu Bansal

10

最快最简单的方法可能是使用sqlite .dump命令,在这种情况下,创建示例数据库的转储。

sqlite3 sample.db .dump > dump.sql

然后(理论上)您可以使用root用户将其导入mysql数据库,在本例中为数据库服务器127.0.0.1上的测试数据库。

mysql -p -u root -h 127.0.0.1 test < dump.sql

我在理论上说,因为语法之间存在一些差异。

在sqlite开始交易

BEGIN TRANSACTION;
...
COMMIT;

MySQL只使用

BEGIN;
...
COMMIT;

还有其他类似的问题(varchars和双引号回想起),但是找不到并替换没有解决的问题。

也许您应该问为什么要迁移,如果性能/数据库的大小是问题,也许要重新架构,再看看系统是否正在转向功能更强大的产品,这可能是规划数据未来的理想时机。


2
但最困难的任务是betweek语法的差异
francois 2012年


8
aptitude install sqlfairy libdbd-sqlite3-perl

sqlt -f DBI --dsn dbi:SQLite:../.open-tran/ten-sq.db -t MySQL --add-drop-table > mysql-ten-sq.sql
sqlt -f DBI --dsn dbi:SQLite:../.open-tran/ten-sq.db -t Dumper --use-same-auth > sqlite2mysql-dumper.pl
chmod +x sqlite2mysql-dumper.pl
./sqlite2mysql-dumper.pl --help
./sqlite2mysql-dumper.pl --add-truncate --mysql-loadfile > mysql-dump.sql
sed -e 's/LOAD DATA INFILE/LOAD DATA LOCAL INFILE/' -i mysql-dump.sql

echo 'drop database `ten-sq`' | mysql -p -u root
echo 'create database `ten-sq` charset utf8' | mysql -p -u root
mysql -p -u root -D ten-sq < mysql-ten-sq.sql
mysql -p -u root -D ten-sq < mysql-dump.sql

7

我刚刚完成了此过程,并且在此Q / A中有很多很好的帮助和信息,但是我发现我不得不将各种要素(以及其他Q / A中的某些要素)整合在一起,以在其中获得有效的解决方案。为了成功迁移。

但是,即使结合了现有的答案,我仍然发现Python脚本对我来说并不完全有效,因为在INSERT中出现多个布尔值的地方它不起作用。看这里为什么会这样。

所以,我想我应该在这里发布合并的答案。当然,值得赞扬的是那些在其他地方做出贡献的人。但是我想回馈一些东西,并节省其他时间。

我将在下面发布脚本。但是首先,这是进行转换的说明...

我在OS X 10.7.5 Lion上运行了脚本。Python开箱即用。

要从您现有的SQLite3数据库生成MySQL输入文件,请按以下步骤在您自己的文件上运行脚本,

Snips$ sqlite3 original_database.sqlite3 .dump | python ~/scripts/dump_for_mysql.py > dumped_data.sql

然后,我将生成的dumped_sql.sql文件复制到运行我的MySQL数据库的运行Ubuntu 10.04.4 LTS的Linux盒中。

导入MySQL文件时,我遇到的另一个问题是某些Unicode UTF-8字符(特别是单引号)没有正确导入,因此我必须在命令中添加一个开关以指定UTF-8。

将数据输入到新的空MySQL数据库中的结果命令如下:

Snips$ mysql -p -u root -h 127.0.0.1 test_import --default-character-set=utf8 < dumped_data.sql

让它煮,就应该这样!之前和之后,请不要忘记仔细检查您的数据。

因此,按照OP的要求,只要您知道怎么做,它便快速简便!:-)

顺便说一句,在研究迁移之前,我不确定的一件事就是是否保留created_at和updated_at字段值-对我来说,好消息是它们是,因此我可以迁移现有的生产数据。

祝好运!

更新

自从进行此切换后,我注意到了一个以前从未注意到的问题。在我的Rails应用程序中,我的文本字段被定义为“字符串”,并且一直传递到数据库模式。此处概述的过程导致它们在MySQL数据库中被定义为VARCHAR(255)。这对这些字段大小设置了255个字符的限制-超出此限制的任何内容在导入过程中都会被无提示地截断。我认为,要支持大于255的文本长度,MySQL模式将需要使用“ TEXT”而不是VARCHAR(255)。此处定义的过程不包括此转换。


这是适用于我的数据的合并和修订的Python脚本:

#!/usr/bin/env python

import re
import fileinput

def this_line_is_useless(line):
    useless_es = [
        'BEGIN TRANSACTION',
        'COMMIT',
        'sqlite_sequence',
        'CREATE UNIQUE INDEX',        
        'PRAGMA foreign_keys=OFF'
        ]
    for useless in useless_es:
        if re.search(useless, line):
            return True

def has_primary_key(line):
    return bool(re.search(r'PRIMARY KEY', line))

searching_for_end = False
for line in fileinput.input():
    if this_line_is_useless(line): continue

    # this line was necessary because ''); was getting
    # converted (inappropriately) to \');
    if re.match(r".*, ''\);", line):
        line = re.sub(r"''\);", r'``);', line)

    if re.match(r'^CREATE TABLE.*', line):
        searching_for_end = True

    m = re.search('CREATE TABLE "?([A-Za-z_]*)"?(.*)', line)
    if m:
        name, sub = m.groups()
        line = "DROP TABLE IF EXISTS %(name)s;\nCREATE TABLE IF NOT EXISTS `%(name)s`%(sub)s\n"
        line = line % dict(name=name, sub=sub)
        line = line.replace('AUTOINCREMENT','AUTO_INCREMENT')
        line = line.replace('UNIQUE','')
        line = line.replace('"','')
    else:
        m = re.search('INSERT INTO "([A-Za-z_]*)"(.*)', line)
        if m:
            line = 'INSERT INTO %s%s\n' % m.groups()
            line = line.replace('"', r'\"')
            line = line.replace('"', "'")
            line = re.sub(r"(?<!')'t'(?=.)", r"1", line)
            line = re.sub(r"(?<!')'f'(?=.)", r"0", line)

    # Add auto_increment if it's not there since sqlite auto_increments ALL
    # primary keys
    if searching_for_end:
        if re.search(r"integer(?:\s+\w+)*\s*PRIMARY KEY(?:\s+\w+)*\s*,", line):
            line = line.replace("PRIMARY KEY", "PRIMARY KEY AUTO_INCREMENT")
        # replace " and ' with ` because mysql doesn't like quotes in CREATE commands

    # And now we convert it back (see above)
    if re.match(r".*, ``\);", line):
        line = re.sub(r'``\);', r"'');", line)

    if searching_for_end and re.match(r'.*\);', line):
        searching_for_end = False

    if re.match(r"CREATE INDEX", line):
        line = re.sub('"', '`', line)

    print line,

1
谢谢。上面当前编写的脚本中存在语法错误;第41行上的“ else:”未处于适当的缩进级别。我不清楚上面的行是否应该缩进,或者是否正在进行其他操作。想要更新吗?
Dan Tenenbaum 2015年


5

最近,我不得不从MySQL迁移到JavaDB,以进行我们团队正在研究的项目。我找到了由Apache编写的名为DdlUtilsJava库,这使此工作变得非常容易。它提供了一个API,可让您执行以下操作:

  1. 发现数据库的架构,并将其导出为XML文件。
  2. 根据此架构修改数据库。
  3. 假设记录具有相同的架构,则将记录从一个DB导入到另一个DB。

我们最终使用的工具并不是完全自动化的,但是效果很好。即使您的应用程序不是使用Java编写的,也不用太费力地挑起一些小工具来进行一次迁移。我认为我能够用不到150行的代码来完成我们的迁移。


4

不需要任何脚本,命令等。

您只需要将sqlite数据库导出为.csv文件,然后使用phpmyadmin将其导入Mysql。

我用了它,效果很棒...


结合,这是唯一对我有用的答案。
cdauth

3

基于Jims的解决方案: 将SQLite3迁移到MySQL的快速简便方法?

sqlite3 your_sql3_database.db .dump | python ./dump.py > your_dump_name.sql
cat your_dump_name.sql | sed '1d' | mysql --user=your_mysql_user --default-character-set=utf8 your_mysql_db -p  

这对我有用。我使用sed只是抛出第一行,这与mysql不一样,但是您最好修改dump.py脚本以丢掉这一行。


1
我对导入的数据存在一些UTF-8编码问题,但是在导入命令中添加--default-character-set = utf8似乎已解决了该问题。从这个Q / A摘自:stackoverflow.com/questions/346092/...
零星消息

好的,我已经添加了-可以吗?
alekwisnia 2012年

那是我使用额外开关的地方,是的。
Snips 2012年

3

获取SQL转储

moose@pc08$ sqlite3 mySqliteDatabase.db .dump > myTemporarySQLFile.sql

导入转储到MySQL

对于小额进口:

moose@pc08$ mysql -u <username> -p
Enter password:
....
mysql> use somedb;
Database changed
mysql> source myTemporarySQLFile.sql;

要么

mysql -u root -p somedb < myTemporarySQLFile.sql

这将提示您输入密码。请注意:如果您想直接输入密码,则必须在以下位置直接输入密码-p

mysql -u root -pYOURPASS somedb < myTemporarySQLFile.sql

对于较大的转储:

mysqlimport或其他导入工具,例如BigDump

BigDump给您进度条:

在此处输入图片说明


12
由于sqlite与mysql中的语法略有不同和标志,因此无法使用。您仍然需要手动将其转换。
dlite922 2014年

1

哈...我希望我先找到这个!我的回应是对这个帖子... 脚本将mysql dump sql文件转换为可以导入sqlite3 db的格式

结合两者正是我所需要的:


当sqlite3数据库将与ruby一起使用时,您可能需要更改:

tinyint([0-9]*) 

至:

sed 's/ tinyint(1*) / boolean/g ' |
sed 's/ tinyint([0|2-9]*) / integer /g' |

,,这只有一半有效,因为即使您将1和0插入标记为boolean的字段中,sqlite3也会将它们存储为1和0,因此您必须执行以下操作:

Table.find(:all, :conditions => {:column => 1 }).each { |t| t.column = true }.each(&:save)
Table.find(:all, :conditions => {:column => 0 }).each { |t| t.column = false}.each(&:save)

但是让sql文件查找所有布尔值会有所帮助。


1

我用Python3编写了这个简单的脚本。它可以用作包含的类或通过终端外壳调用的独立脚本。默认情况下,它将所有整数导入int(11)varchar(300),将所有字符串导入为,但是可以分别在构造函数或脚本参数中进行调整。

注意:它需要MySQL Connector / Python 2.0.4或更高版本

如果您发现下面的代码很难阅读,这是GitHub上源代码的链接:https : //github.com/techouse/sqlite3-to-mysql

#!/usr/bin/env python3

__author__ = "Klemen Tušar"
__email__ = "techouse@gmail.com"
__copyright__ = "GPL"
__version__ = "1.0.1"
__date__ = "2015-09-12"
__status__ = "Production"

import os.path, sqlite3, mysql.connector
from mysql.connector import errorcode


class SQLite3toMySQL:
    """
    Use this class to transfer an SQLite 3 database to MySQL.

    NOTE: Requires MySQL Connector/Python 2.0.4 or higher (https://dev.mysql.com/downloads/connector/python/)
    """
    def __init__(self, **kwargs):
        self._properties = kwargs
        self._sqlite_file = self._properties.get('sqlite_file', None)
        if not os.path.isfile(self._sqlite_file):
            print('SQLite file does not exist!')
            exit(1)
        self._mysql_user = self._properties.get('mysql_user', None)
        if self._mysql_user is None:
            print('Please provide a MySQL user!')
            exit(1)
        self._mysql_password = self._properties.get('mysql_password', None)
        if self._mysql_password is None:
            print('Please provide a MySQL password')
            exit(1)
        self._mysql_database = self._properties.get('mysql_database', 'transfer')
        self._mysql_host = self._properties.get('mysql_host', 'localhost')

        self._mysql_integer_type = self._properties.get('mysql_integer_type', 'int(11)')
        self._mysql_string_type = self._properties.get('mysql_string_type', 'varchar(300)')

        self._sqlite = sqlite3.connect(self._sqlite_file)
        self._sqlite.row_factory = sqlite3.Row
        self._sqlite_cur = self._sqlite.cursor()

        self._mysql = mysql.connector.connect(
            user=self._mysql_user,
            password=self._mysql_password,
            host=self._mysql_host
        )
        self._mysql_cur = self._mysql.cursor(prepared=True)
        try:
            self._mysql.database = self._mysql_database
        except mysql.connector.Error as err:
            if err.errno == errorcode.ER_BAD_DB_ERROR:
                self._create_database()
            else:
                print(err)
                exit(1)

    def _create_database(self):
        try:
            self._mysql_cur.execute("CREATE DATABASE IF NOT EXISTS `{}` DEFAULT CHARACTER SET 'utf8'".format(self._mysql_database))
            self._mysql_cur.close()
            self._mysql.commit()
            self._mysql.database = self._mysql_database
            self._mysql_cur = self._mysql.cursor(prepared=True)
        except mysql.connector.Error as err:
            print('_create_database failed creating databse {}: {}'.format(self._mysql_database, err))
            exit(1)

    def _create_table(self, table_name):
        primary_key = ''
        sql = 'CREATE TABLE IF NOT EXISTS `{}` ( '.format(table_name)
        self._sqlite_cur.execute('PRAGMA table_info("{}")'.format(table_name))
        for row in self._sqlite_cur.fetchall():
            column = dict(row)
            sql += ' `{name}` {type} {notnull} {auto_increment}, '.format(
                name=column['name'],
                type=self._mysql_string_type if column['type'].upper() == 'TEXT' else self._mysql_integer_type,
                notnull='NOT NULL' if column['notnull'] else 'NULL',
                auto_increment='AUTO_INCREMENT' if column['pk'] else ''
            )
            if column['pk']:
                primary_key = column['name']
        sql += ' PRIMARY KEY (`{}`) ) ENGINE = InnoDB CHARACTER SET utf8'.format(primary_key)
        try:
            self._mysql_cur.execute(sql)
            self._mysql.commit()
        except mysql.connector.Error as err:
            print('_create_table failed creating table {}: {}'.format(table_name, err))
            exit(1)

    def transfer(self):
        self._sqlite_cur.execute("SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%'")
        for row in self._sqlite_cur.fetchall():
            table = dict(row)
            # create the table
            self._create_table(table['name'])
            # populate it
            print('Transferring table {}'.format(table['name']))
            self._sqlite_cur.execute('SELECT * FROM "{}"'.format(table['name']))
            columns = [column[0] for column in self._sqlite_cur.description]
            try:
                self._mysql_cur.executemany("INSERT IGNORE INTO `{table}` ({fields}) VALUES ({placeholders})".format(
                    table=table['name'],
                    fields=('`{}`, ' * len(columns)).rstrip(' ,').format(*columns),
                    placeholders=('%s, ' * len(columns)).rstrip(' ,')
                ), (tuple(data) for data in self._sqlite_cur.fetchall()))
                self._mysql.commit()
            except mysql.connector.Error as err:
                print('_insert_table_data failed inserting data into table {}: {}'.format(table['name'], err))
                exit(1)
        print('Done!')


def main():
    """ For use in standalone terminal form """
    import sys, argparse
    parser = argparse.ArgumentParser()
    parser.add_argument('--sqlite-file', dest='sqlite_file', default=None, help='SQLite3 db file')
    parser.add_argument('--mysql-user', dest='mysql_user', default=None, help='MySQL user')
    parser.add_argument('--mysql-password', dest='mysql_password', default=None, help='MySQL password')
    parser.add_argument('--mysql-database', dest='mysql_database', default=None, help='MySQL host')
    parser.add_argument('--mysql-host', dest='mysql_host', default='localhost', help='MySQL host')
    parser.add_argument('--mysql-integer-type', dest='mysql_integer_type', default='int(11)', help='MySQL default integer field type')
    parser.add_argument('--mysql-string-type', dest='mysql_string_type', default='varchar(300)', help='MySQL default string field type')
    args = parser.parse_args()

    if len(sys.argv) == 1:
        parser.print_help()
        exit(1)

    converter = SQLite3toMySQL(
        sqlite_file=args.sqlite_file,
        mysql_user=args.mysql_user,
        mysql_password=args.mysql_password,
        mysql_database=args.mysql_database,
        mysql_host=args.mysql_host,
        mysql_integer_type=args.mysql_integer_type,
        mysql_string_type=args.mysql_string_type
    )
    converter.transfer()

if __name__ == '__main__':
    main()

0

这个脚本是可以的,除了这种情况,我当然已经遇到了:

将“ INSERT INTO“ requestcomparison_stopword” VALUES(149,'f');
将“ INSERT INTO“ requestcomparison_stopword” VALUES(420,'t');

该脚本应提供以下输出:

INSERT INTO requestcomparison_stopword VALUES(149,'f');
INSERT INTO requestcomparison_stopword VALUES(420,'t');

但是给出了输出:

INSERT INTO requestcomparison_stopword VALUES(1490;
插入requestrecomparison_stopword VALUES(4201;

在最后的0和1周围带有一些奇怪的非ascii字符。

当我注释了以下代码行(43-46)时,此问题不再显示,但出现了其他问题:


    line = re.sub(r"([^'])'t'(.)", "\1THIS_IS_TRUE\2", line)
    line = line.replace('THIS_IS_TRUE', '1')
    line = re.sub(r"([^'])'f'(.)", "\1THIS_IS_FALSE\2", line)
    line = line.replace('THIS_IS_FALSE', '0')

这只是一个特例,当我们想添加一个值'f'或't'但我对正则表达式不太满意时,我只想发现这种情况可以被某人纠正。

无论如何,非常感谢您的方便脚本!


0

这个简单的解决方案为我工作:

<?php
$sq = new SQLite3( 'sqlite3.db' );

$tables = $sq->query( 'SELECT name FROM sqlite_master WHERE type="table"' );

while ( $table = $tables->fetchArray() ) {
    $table = current( $table );
    $result = $sq->query( sprintf( 'SELECT * FROM %s', $table ) );

    if ( strpos( $table, 'sqlite' ) !== false )
        continue;

    printf( "-- %s\n", $table );
    while ( $row = $result->fetchArray( SQLITE3_ASSOC ) ) {
        $values = array_map( function( $value ) {
            return sprintf( "'%s'", mysql_real_escape_string( $value ) );
        }, array_values( $row ) );
        printf( "INSERT INTO `%s` VALUES( %s );\n", $table, implode( ', ', $values ) );
    }
}

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.