`

用python把postgresql中的表内容复制到mysql中

 
阅读更多

postgresql中的表和mysql中的表结构不一样,过程中做点转换,特别是datetime的insert

还有activated 字段在原表中是布尔型,mysql表中是tinyint型

 

 

import psycopg2
import MySQLdb
import datetime, time


psycopg2_conn = psycopg2.connect(
        database="expat", 
        user="david", 
        password="1", 
        host="localhost", 
        port="5432"
    ) 
mysql_conn= MySQLdb.connect(
        host='localhost',
        port = 3306,
        user='root',
        passwd='1',
        db ='blog',
    )


def get_user_data():
    cur = psycopg2_conn.cursor()
    cur.execute("SELECT * FROM auth_user;")
    rows = cur.fetchall() 
    cur.close()
    psycopg2_conn.commit()
    psycopg2_conn.close()

    return rows
#get_user_data()


def save_user_to_mysql(rows):
    cur = mysql_conn.cursor()
    for row in rows:
        newrow = list()
        newrow.append(row[0]) # 0 id 
        newrow.append(row[4]) # 1 name
        newrow.append(row[7]) # 2 email
        newrow.append('') # 3 password
        newrow.append(1) if row[9] is True else newrow.append(0) # 5 activated
        newrow.append(0)      # 6 banned
        r2 = row[2]
        last_login = datetime.datetime(r2.year, r2.month, r2.day, r2.hour, r2.minute, r2.second)
        last_login = last_login.strftime('%Y-%m-%d %H:%M:%S')

        newrow.append(last_login) # 9 last_login
        newrow.append(0) # 12 protected
        r10 = row[10]
        created_at = datetime.datetime(r10.year, r10.month, r10.day, r10.hour, r10.minute, r10.second)
        created_at = created_at.strftime('%Y-%m-%d %H:%M:%S')
        newrow.append(created_at) #  13 created_at
        newrow.append(row[1]) # 16 password_old

        sql = '''
            insert into users(id, name, email, password, activated, banned,last_login,protected, created_at,password_old) 
                       values(%d, '%s', '%s',  '%s',     %s,        %d,    '%s',        %d,        '%s',        '%s')
        ''' % tuple(newrow)
        print sql
        cur.execute(sql) 

        if row[3] is True: # is_superuser is True
            cur.execute('''
                insert into users_groups (user_id, group_id)
                values(%d, 1)
                ''' % row[0]
                ) 

    cur.close()
    mysql_conn.commit()
    mysql_conn.close()
#save_user_to_mysql(None)



if __name__ == '__main__':
    rows=get_user_data()
    save_user_to_mysql(rows)
    pass

 

同时还要拷贝个profile表,稍微复杂点,sql写的很坑爹啊

import psycopg2
import MySQLdb
import datetime, time


psycopg2_conn = psycopg2.connect(
        database="expat", 
        user="david", 
        password="1", 
        host="localhost", 
        port="5432"
    ) 
mysql_conn= MySQLdb.connect(
        host='localhost',
        port = 3306,
        user='root',
        passwd='1',
        db ='blog',
    )


def get_user_data():
    cur = psycopg2_conn.cursor()
    #cur.execute("SELECT * FROM auth_user;")
    cur.execute(
    "select * from auth_user join accounts_myprofile on auth_user.id = accounts_myprofile.user_id;"
        )
    rows = cur.fetchall() 

    cur.close()
    psycopg2_conn.commit()
    psycopg2_conn.close()
    #for row in rows:
    #    print row
    return rows
#get_user_data()


def save_user_to_mysql(rows):
    cur = mysql_conn.cursor()
    for row in rows:
        ####### insert into user table
        userrow = list()
        userrow.append(row[0]) # 0 id 
        userrow.append(row[4]) # 1 name
        userrow.append(row[7]) # 2 email
        userrow.append('') # 3 password
        userrow.append(1) if row[9] is True else userrow.append(0) # 5 activated
        userrow.append(0)      # 6 banned
        r2 = row[2]
        last_login = datetime.datetime(r2.year, r2.month, r2.day, r2.hour, r2.minute, r2.second)
        last_login = last_login.strftime('%Y-%m-%d %H:%M:%S')

        userrow.append(last_login) # 9 last_login
        userrow.append(0) # 12 protected
        r10 = row[10]
        created_at = datetime.datetime(r10.year, r10.month, r10.day, r10.hour, r10.minute, r10.second)
        created_at = created_at.strftime('%Y-%m-%d %H:%M:%S')
        userrow.append(created_at) #  13 created_at
        userrow.append(row[1]) # 16 password_old

        sql = '''
            insert into users(id, name, email, password, activated, banned,last_login,protected, created_at,password_old) 
                       values(%d, '%s', '%s',  '%s',     %s,        %d,    '%s',        %d,        '%s',        '%s')
        ''' % tuple(userrow)
        
        cur.execute(sql) 

        ######## insert into user group
        if row[3] is True: # is_superuser is True
            cur.execute('''
                insert into users_groups (user_id, group_id)
                values(%d, 1)
                ''' % row[0]
                )

        ######## insert into profile table
        print row
        profile_row = list()
        profile_row.append(row[11])  # profile table field  id
        profile_row.append(row[0])   # user_id
        profile_row.append(row[5]) if row[5] else profile_row.append('')  # first_name
        profile_row.append(row[6]) if row[6] else profile_row.append('')  # last_name
        profile_row.append(row[16]) if row[16] else profile_row.append('')  # phone
        profile_row.append(row[15]) if row[15] else profile_row.append('')  # address
        profile_row.append(created_at)   # created_at
        profile_row.append(row[12]) if row[12] else profile_row.append('')  # mugshot
        profile_row.append(row[13])   # privacy
        profile_row.append(row[17]) if row[17] else profile_row.append('')  # company_name
        profile_row.append(row[14]) if row[14] else profile_row.append('null')   # housing_uid
        profile_row.append(row[18]) if row[18] else profile_row.append('null')   # live_area
        profile_row.append(row[19]) if row[19] else profile_row.append('null')   # come_from
        profile_row.append(row[20]) if row[20] else profile_row.append('null')   # come_reason
        profile_row.append(row[21]) if row[21] else profile_row.append('null')   # gender
        profile_row.append(row[22]) if row[22] else profile_row.append('null')   # marital
        profile_row.append(row[23]) if row[23] else profile_row.append('null')   # kids
        #profile_row.append(row[26])   # is_bussiness
        profile_row.append(1) if row[26] is True else profile_row.append(0) # is_bussiness
        #profile_row.append(row[27])   # is_paid_for_classifieds
        profile_row.append(1) if row[27] is True else profile_row.append(0) # is_paid_for_classifieds
        #profile_row.append(row[28])   # is_approved
        profile_row.append(1) if row[28] is True else profile_row.append(0) # is_approved
        if row[24]:
            r24 = row[24]
            birthday = datetime.datetime(r24.year, r24.month, r24.day)
            birthday = birthday.strftime('%Y-%m-%d')
            profile_row.append(birthday)   # birthday
        else:
            profile_row.append(row[24])



        profile_sql = '''
        insert into user_profile(id, user_id, first_name, last_name, phone, address,created_at,mugshot, privacy,company_name,housing_uid, live_area, come_from, come_reason, gender, marital, kids, is_bussiness, is_paid_for_classifieds, is_approved, birthday) 
                          values(%d, %d,      '%s',       '%s',      '%s',  '%s',   '%s',      '%s',    '%s',   '%s',        %s,          %s,        %s,        %s,          %s,     %s,      %s,   %s,            %d,                       %d,        '%s'  )
        '''% tuple(profile_row)
        print profile_sql
        cur.execute(profile_sql) 
    cur.close()
    mysql_conn.commit()
    mysql_conn.close()
#save_user_to_mysql(None)



if __name__ == '__main__':
    rows=get_user_data()
    save_user_to_mysql(rows)
    pass

 

 

 

article表 从pgsql拷到mysql

1  article表拷到本地pg数据库

   1.1 $ pg_dump -h xxx -U username expat -t article_article >/home/david/article_article.sql

   1.2 改sql文件中的用户名,改为本地数据库的用户名  例如username-->david

   1.3 $ psql -h localhost -U david postgres -t article_article< /home/david/article_article.sql

2  从postgres中导出数据到csv中

   2.1 新建一个csv文档,给权限,$ chmod 777 article_article.csv

   2.2 以超级用户postgres, 密码postgres 登录 pgsql, 

       运行sql, $ COPY (SELECT * FROM article_article) TO '/home/david/article_article.csv' WITH CSV HEADER;

   2.3 用vim把导出的csv文件的第一行删掉(culomn名删了)

3  csv中导入mysql

   3.1 mysql 是从 /var/lib/mysql/blog (blog是数据库名)这个目录下读文件的,所以把csv放到此目录下

       $ sudo cp article_article.csv /var/lib/mysql/blog/article_article.csv

   3.2 建一个表article_article 

   3.3然后在mysql运行sql命令:

load data infile 'article_article.csv' 

into table blog.article_article

fields terminated by ',' optionally enclosed by '"' escaped by '"' 

lines terminated by '\n'; 

4  pgsql用true false表示boolean,mysql用0,1,此时的mysql的article表中布尔值都是0,明显不对, 所以要做修改,我是用python脚本

 

import psycopg2
import MySQLdb
import datetime, time



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():
    '''

    '''
    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 
        ''')
    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_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()


if __name__ == '__main__':
    #copy_category()
    #copy_author()
    #copy_article()
    import_mysql_boolean()
    #copy_article_tags()
    pass

 

分享到:
评论

相关推荐

    PyPI 官网下载 | mysql2postgresql-0.3.0.tar.gz

    了解如何在Python环境中安装和使用此类库,以及对MySQL和PostgreSQL数据库的基本知识,对于进行跨数据库的数据迁移至关重要。在实际操作中,正确配置数据库连接参数,理解数据迁移的潜在问题,以及熟悉所使用的库的...

    MySQL和PostgreSQL的比较

    MySQL的表类型和索引类型受到存储引擎限制,如MyISAM支持B-Tree,InnoDB也支持B-Tree。PostgreSQL则更为灵活,支持B-树、哈希、R-树和Gist等多种索引类型,以及临时表、常规表和复杂分区表。 #### 十、约束与扩展...

    Python-pgchameleon是一个从MySQL复制到PostgreSQL的工具

    pg_chameleon是一个从MySQL复制到PostgreSQL的工具,兼容Python 2.7和Python 3.3 。该系统使用库mysql-replication来从MySQL拉取行镜像,将其转换成jsonb对象。一个pl/pgsql函数解码该jsonb对象,然后将更改重新执行...

    用Python FastAPI与PostgreSQL进行增删改查操作

    这个端点接受一个包含用户姓名和电子邮件的JSON对象,并将其插入到用户表中,同时返回新创建的用户ID。 5. **更新数据(Update)** 更新数据涉及PUT或PATCH请求。假设我们已经有了一个用户ID,我们可以创建一个...

    Python多线程超大日志文件解析转储写入mysql/postgresql

    2.多线程写入数据到数据库postgresql/mysql 3.线程之间通过队列queue通讯 4.出错消息通过logging写日志 @author: ray ----------web日志格式如下----------------- 21.106.138.118 - - [02/Mar/2015:16:27:22 +0800...

    python操作Oracle、PostgreSQL,MySql数据库增删改查

    python操作链接Oracle、PostgreSQL,MySql数据库增删改查代码,通过PooledDB实现池链接,实际运维中积累

    PostgreSQL 与 MySQL 比较

    用户定义函数可以用PL/pgSQL(一种专为PostgreSQL设计的过程语言)、PL/Tcl、PL/Perl、PL/Python、SQL和C等语言编写。 #### 十五、触发器 **MySQL**: MySQL支持行前触发器、行后触发器和语句触发器,触发器语句用...

    sql_CONNECT.zip_MYSQL_mysql python_python sql_python 数据库_python数

    在提供的压缩包子文件"sql_连接数据库.py"中,我们可以推测这是一个实际的Python脚本,它展示了如何使用Python连接到MySQL数据库。 现在,让我们详细讨论相关知识点: 1. **Python的数据库接口模块**:Python提供...

    将MySQL或PostgreSQL的库表导出产生WORD文档

    4. **数据填充**:使用编程语言(如Python、Java或Perl)配合数据库连接库(如pymysql、psycopg2等),遍历获取的库表信息,并填入到Word模板中。这可能涉及到字符串格式化、模板引擎(如Jinja2)或者直接操作Word...

    python操作mysql数据库上课讲义.pdf

    Python DB-API,全称为Python Database API Specification v2.0,是Python编程语言中用于数据库操作的标准接口。这个规范定义了一套标准的对象和方法,使得开发者能够以统一的方式访问不同的数据库系统,比如MySQL、...

    基于Sphinx+MySql+Python的站内搜索引擎的设计与实现.pdf

    根据给定文件信息,以下是对标题、描述、标签及部分内容中提到的知识点的详细说明: 1. Sphinx搜索引擎介绍: Sphinx是一个开源的全文搜索引擎,采用GPLv2许可证发布,专门为数据库全文检索提供解决方案。它具有...

    postgresql第三课:眼花缭乱的extension体系1

    例如,要安装 plv8 插件,需要在 Windows 平台上使用 MSVC 编译器编译,或者直接下载预编译好的二进制文件,并将其复制到 PostgreSQL 的安装目录中。 pgxn 工具 pgxn 是一个类似于 pip 的包管理工具,用于下载和...

    python Django连接MySQL数据库做增删改查

    1、下载安装MySQLdb类库http://www.djangoproject.com/r/python-mysql/2、修改settings.py 配置数据属性复制代码 代码如下:DATABASES = { ‘default’: { ‘ENGINE’: ‘django.db.backends.mysql’, # Add ...

    PostgreSQL修炼之道从小工到专家

    9. **扩展与开发**:介绍如何编写自定义函数、存储过程,使用PL/pgSQL和其他编程语言(如C)开发PostgreSQL扩展,以及使用PL/Perl、PL/Python等脚本语言。 10. **安全与审计**:讲解PostgreSQL的安全特性,如角色和...

    Python-HeidiSQL一个用于管理MySQLMSSQL和PostgreSQL的图形客户端

    在数据库管理方面,Python提供了多种库来方便开发者与各种类型的数据库进行交互,例如MySQL、MSSQL(Microsoft SQL Server)和PostgreSQL。其中,`PyMySQL`是用于连接MySQL数据库的Python库,`pyodbc`则适用于MSSQL...

    MySQL、Oracle、PostgreSQL、SQLite、SQL Server、MariaDB 和/或 MongoDB

    在给定的标题和描述中提到了多个知名的DBMS,包括MySQL、Oracle、PostgreSQL、SQLite、SQL Server、MariaDB和MongoDB。下面将分别对这些数据库系统进行详细介绍。 1. MySQL: MySQL是一款开源、免费的关系型数据库...

Global site tag (gtag.js) - Google Analytics