从postgresql中 导数据到 mysql

本文详细介绍了如何将数据从PostgreSQL数据库导出到CSV,然后导入到MySQL的过程。涉及修改含有分隔符的字段,使用COPY命令导出数据,删除CSV头部列名,以及处理PostgreSQL中的boolean值转换。最后,通过Python脚本更新导入后的布尔值问题和解决特殊字符转义的解决方案。

从postgres中导出数据到csv中

1  用postgres用户(root)登录postgresql

2 建一个csv文件,并 chmod 777


3 在原数据中修改----title中的;改成:(有;的标题在导出到csv中时会被拆分成两列)
update article_article set title =  'China’s Copycats: Online vs. Offline.' where id=7939;
update article_article set title =  'Web browsers used most in China: how this impacts online campaigns.' where id=7804;
update article_article set title =  'Web browsers used most in China: how this impacts online campaigns.' where id=7926;
update article_article set title =  'Douban.com: China’s Amazon/Digg Hybrid Social Media Network.' where id=7973;
update article_article set title ='“China average daily salary is RMB 111.99???”: Chinese netizens challenge government statistics. ' where id=8029;
update article_article set title =  'China Telecom: Becoming the telephone version of Google.' where id=8072;
update article_article set title =  'The Rich Tighten Pockets: Online Shopping is New Obsession' where id=8169;
update article_article set title =  'The Good, The Bad And The Foreigner: Learning To Accept Myself Through The Eyes Of Others.' where id=7541;
update article_article set title =  'Johnson & Johnson: Big girls don’t cry… or let their bones break.' where id=8066;
select * from article_article where title like '%;%';

4----超级用户postgres,  登录
运行sql
COPY (SELECT * FROM article_article limit 50) TO '/home/david/myfile.csv' WITH CSV HEADER;
5--把导出的csv文件的第一行(culomn名删了)
csv导入mysql
1----mysql 是从 /var/lib/mysql/blog (blog是数据库名)这个目录下读文件的,所以把csv放到此目录下
然后在mysql运行sql命令:
load data infile 'myfile.csv'
into table blog.article
fields terminated by ',' optionally enclosed by '"' escaped by '"'
lines terminated by '\n';

***问题
postgres中boolean是用true和false表示 (在csv中是t和f)
但mysql中是用1和0(tinyint)表示,直接导入的话在mysql中都是显示0
把t和f改成1和0
2----导入后用py脚本update布尔值

#encoding:utf-8
import psycopg2
import MySQLdb

psycopg2_conn = psycopg2.connect(
        #database="expat", 
        database="postgres", 
        user="david", 
        password="1", 
        host="localhost", 
        port="5432"
    )

mysql_conn= MySQLdb.connect(
        host='localhost',
        port = 3306,
        user='root',
        passwd='1',
        db ='blog',
    )


def import_mysql_boolean():
    '''
    postgres中boolean是用true和false表示 (在csv中是t和f)
    但mysql中是用1和0(tinyint)表示,直接导入的话在mysql中都是显示0
    直接改csv把t和f改成1和0导致导入mysql的某些数据column对不上

    先把原数据导入mysql,再通过这个函数update布尔值
    '''
    cur = psycopg2_conn.cursor()
    cur.execute('''
        select id,is_approved, is_special, is_welcome, is_shf_featured,
            is_shf_sponsored, is_homepage_sponsored, is_home_featured
        from article_article 
        --where id in (8029 ,10691,  10099, 8810, 8936, 8939 , 10126 ,10128 ,10222 ,9217 ,9178,7898,7899)
        --limit 1000
        ''')
    rows = cur.fetchall() 
    #print rows

    cur.close()
    psycopg2_conn.commit()
    psycopg2_conn.close()

    cur2 = mysql_conn.cursor()

    for row in rows:
        arow = list()
        arow.append(row[0])
        arow.append(1) if row[1] is True else arow.append(0) # is_approved
        arow.append(1) if row[2] is True else arow.append(0) # is_special
        arow.append(1) if row[3] is True else arow.append(0) # is_welcome
        arow.append(1) if row[4] is True else arow.append(0) # is_shf_featured
        arow.append(1) if row[5] is True else arow.append(0) # is_shf_sponsored
        arow.append(1) if row[6] is True else arow.append(0) # is_homepage_sponsored
        arow.append(1) if row[7] is True else arow.append(0) # is_home_featured
        sql = '''
        update article set 
            is_approved={is_approved}, 
            is_special={is_special}, 
            is_welcome={is_welcome}, 
            is_shf_featured={is_shf_featured}, 
            is_shf_sponsored={is_shf_sponsored}, 
            is_homepage_sponsored={is_homepage_sponsored}, 
            is_home_featured={is_home_featured}
        where id = {id}
        '''.format(id=arow[0],
                   is_approved=arow[1],
                   is_special=arow[2],
                   is_welcome=arow[3],
                   is_shf_featured=arow[4],
                   is_shf_sponsored=arow[5],
                   is_homepage_sponsored=arow[6],
                   is_home_featured=arow[7],

            )

        print sql
        cur2.execute(sql) 
    cur2.close()
    mysql_conn.commit()
    mysql_conn.close()

 


有一种情况就是表的某个字段大于csv文件的单元格的限制,这时如果编辑保存csv文件后,实际上这个过大的单元格会被拆分成两个单元格,再导入mysql中也就是表中的两个字段,这会导致表字段不对齐,碰到这种问题就是别去编辑csv文件,先把从postgresql导出的csv直接导入mysql,之后在mysql中用sql修改就不会出错

 

 

还有一种需要转义的情况 比如  要在表格中插入 ‘App\Article’ ,在python中写成 'App\\\Article', 它会被python转义一次,在插入mysql时又会被转一次,最终在mysql的表中就会表示成 ‘App\Article’ 

<think>首先,用户的问题是:“我想将PostgreSQL出的数据MySQL中使用 请问PostgreSQL 数据兼容 MySQL 数据迁移方法”。这涉及到将数据PostgreSQL出并入到MySQL,确保兼容性。 根据系统级指令: - 所有行内数学表达式必须使用$...$格式。 - 独立公式必须使用$$...$$格式并单独成段。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识,例如[^1]。 用户可见层: - 回答结构清晰,帮助用户逐步解决问题。 - 尽量保证回答真实可靠。 参考站内引用: - [^1]: PostgreSQL迁移到MySQL的步骤。 - [^2]: MySQL数据迁移到PostgreSQL入方法。 - [^3]: PostgreSQL出工具pg_dump。 - [^4]: 从MySQLPostgreSQL数据迁移技术。 用户的需求是PostgreSQL数据用于MySQL,所以我需要提供兼容的迁移方法。 关键点: - PostgreSQLMySQL数据类型、语法和功能上有差异。 - 直接出SQL文件可能不兼容,因为PostgreSQL的SQL语法可能与MySQL不同。 - 需要处理数据出、格式转换和入。 步骤基于引用: 1. PostgreSQL数据:使用pg_dump工具数据。 2. 转换数据:修改SQL文件以兼容MySQL语法。 3. 入到MySQL:使用MySQL工具入转换后的文件。 详细步骤: 1. **PostgreSQL数据**: - 使用`pg_dump`命令数据为SQL文件。 - 例如:`pg_dump -U username -d dbname -f output.sql` - 引用[^3]提到pg_dump是PostgreSQL出工具。 2. **转换SQL文件**: - PostgreSQL的SQL文件可能包含MySQL不支持的语法,如数据类型(如`serial` vs `AUTO_INCREMENT`)、函数等。 - 需要手动或使用工具转换。 - 引用[^4]提到替换路径和数据库名称,但更关键的是语法转换。 - 常见转换: - 数据类型:PostgreSQL的`boolean` 转 MySQL的`TINYINT(1)`,`serial` 转 `AUTO_INCREMENT`。 - 引号:PostgreSQL使用双引号,MySQL使用反引号或单引号。 - 函数:如`now()`可能兼容,但其他函数可能需要调整。 - 使用工具如`pg2mysql`或手动编辑。 3. **入到MySQL**: - 使用MySQL的`mysql`命令入SQL文件。 - 例如:`mysql -u username -p dbname < converted.sql` - 引用[^2]提到使用psql或pgAdmin入,但那是针对PostgreSQL的;对于MySQL,使用mysql命令。 确保兼容性: - 测试数据迁移。 - 验证数据完整性。 结构化回答: - 介绍问题。 - 逐步说明方法。 - 提供示例命令。 - 添加引用标识。 - 生成相关问题。 生成相关问题: - 基于示例,创建3-4个相关问题,如优化、常见问题等。 最终回答结构: 1. **引言**:解释兼容性问题。 2. **步骤**: - 步骤1: PostgreSQL数据。 - 步骤2: 转换SQL文件。 - 步骤3: 入到MySQL。 - 步骤4: 验证迁移。 3. **注意事项**:讨论潜在问题。 4. **相关问题**:列出相关问题。 使用中文回答。</think>### PostgreSQL 数据兼容 MySQL数据迁移方法 要将 PostgreSQL 出的数据MySQL 中使用,需要解决语法和数据类型兼容性问题(如 PostgreSQL 的 `serial` 类型与 MySQL 的 `AUTO_INCREMENT` 差异)。直接出 SQL 文件MySQL 可能致错误,因为 PostgreSQL 的 SQL 语法(如双引号标识符、特定函数)与 MySQL 不兼容。以下是经过验证的逐步迁移方法,基于最佳实践和工具推荐。整个过程分为数据出、格式转换、数据入和验证四个步骤,确保可靠迁移[^1][^3][^4]。 #### 步骤 1: PostgreSQL 数据 首先,使用 PostgreSQL 的 `pg_dump` 工具数据为 SQL 文件。`pg_dump` 是 PostgreSQL 的标准出工具,能生成包含表结构和数据的 SQL 脚本[^3]。 - **命令示例**: ```bash pg_dump -U your_username -d your_database -f output.sql ``` - `-U your_username`: 指定 PostgreSQL 用户名。 - `-d your_database`: 指定数据库名。 - `-f output.sql`: 输出文件路径。 - **注意事项**: - 出时添加 `--inserts` 参数以生成兼容的 `INSERT` 语句(避免使用 PostgreSQL 特有的 `COPY` 命令)。 - 确保文件编码为 UTF-8(MySQL 默认编码),使用 `--encoding=UTF8` 参数。 - 如果表结构复杂,先检查数据类型兼容性(如 PostgreSQL 的 `boolean` 应转换为 MySQL 的 `TINYINT(1)`)[^4]。 #### 步骤 2: 转换 SQL 文件以兼容 MySQL 出的 SQL 文件需要修改以匹配 MySQL 语法。这包括数据类型、标识符引号(PostgreSQL 用双引号,MySQL 用反引号)、函数(如 `now()` 可能兼容,但 `generate_series()` 需重写)等。推荐手动编辑或使用转换工具自动化处理。 - **手动转换关键点**: - **数据类型**: - 将 `SERIAL` 替换为 `INT AUTO_INCREMENT`。 - 将 `BOOLEAN` 替换为 `TINYINT(1)`。 - 将 `TEXT` 或 `VARCHAR` 长度调整(MySQL 有最大行限制)。 - **语法调整**: - 替换双引号 `"table_name"` 为反引号 `` `table_name` ``。 - 移除 PostgreSQL 特定语句(如 `SET` 命令设置搜索路径)。 - 统一 `COMMENT` 语法(PostgreSQL 使用 `COMMENT ON`,MySQL 内联在 `CREATE TABLE` 中)。 - **工具辅助转换**: - 使用开源工具如 `pg2mysql`(Python 脚本)自动处理常见问题: ```bash pip install pg2mysql pg2mysql -i output.sql -o converted.sql ``` - 或使用 `sed` 命令批量替换(例如:`sed -i 's/"\(.*\)"/`\1`/g' output.sql`)。 - **注意事项**: - 转换后检查文件:确保无语法错误(如使用文本编辑器或 MySQL 的 `mysqlcheck`)。 - 处理外键和索引:MySQL 的索引语法可能不同,需手动添加 `ENGINE=InnoDB` 指定存储引擎[^1][^4]。 #### 步骤 3: 数据MySQL 将转换后的 SQL 文件MySQL 数据库。使用 MySQL 的命令行工具 `mysql` 或 GUI 工具(如 MySQL Workbench)[^2]。 - **命令示例**: ```bash mysql -u mysql_username -p your_mysql_database < converted.sql ``` - `-u mysql_username`: MySQL 用户名。 - `-p`: 提示输入密码。 - `your_mysql_database`: 目标数据库名(需提前在 MySQL 中创建空数据库)。 - **注意事项**: - 入前在 MySQL 中创建匹配的表结构(使用转换后的 `CREATE TABLE` 语句)。 - 如果文件较大,添加 `--max_allowed_packet=512M` 参数避免超时错误。 - 对于大数据量,分批入(使用 `split` 命令分割文件)[^1][^2]。 #### 步骤 4: 验证迁移结果 确保数据完整性和一致性: - **基本检查**: - 在 MySQL 中运行查询(如 `SELECT COUNT(*) FROM table_name;`),比较 PostgreSQLMySQL 的行数。 - 验证关键字段(如主键、日期)是否一致。 - **高级验证**: - 使用 `mysqldump` MySQL 数据,与原始 PostgreSQL 出对比差异。 - 测试应用连接:确保业务逻辑在 MySQL 中正常工作。 - **常见问题处理**: - 如果入失败,检查错误日志(MySQL 的 `error.log`),常见问题包括数据类型不匹配或语法残留。 - 性能优化:迁移后运行 `OPTIMIZE TABLE` 整理碎片[^1][^4]。 #### 注意事项 - **兼容性挑战**:PostgreSQLMySQL 在事务处理(如 PostgreSQL 的 MVCC vs MySQL 的 InnoDB)和高级功能(如 JSON 支持)上差异较大。建议在迁移前测试样例数据。 - **工具推荐**:对于复杂迁移,使用专业工具如 [pgloader](https://pgloader.io/)(支持实时转换)或 AWS DMS(云服务)。 - **备份策略**:始终在操作前备份 PostgreSQLMySQL 数据库,避免数据丢失。 - **性能影响**:大数据迁移可能耗时;在低峰期操作,并监控资源使用[^3][^4]。 通过以上步骤,您可以高效实现 PostgreSQLMySQL数据迁移。如果遇到具体错误,提供 SQL 片段可进一步诊断。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值