gpt4 book ai didi

将mysql导入postgresql的Python脚本

转载 作者:行者123 更新时间:2023-11-29 00:07:04 25 4
gpt4 key购买 nike

引用Import MySQL dump to PostgreSQL database .一位不知名的开发人员在那里提供了使用以下脚本将 MySQL 数据库导入 PostgreSQL

import MySQLdb
#from magic import Connect #Private mysql connect information - I COMMENTED THIS LINE to use direct connection
db = MySQLdb.connect(host="localhost", # your host, usually localhost
user="USER", # your username
passwd="PASS", # your password
db="w3i") # name of the data base
import psycopg2

dbx=Connect()
DB=psycopg2.connect("dbname='w3i'")
DC=DB.cursor()

mysql='''show tables from w3i'''
dbx.execute(mysql); ts=dbx.fetchall(); tables=[]
for table in ts: tables.append(table[0])
for table in tables:
mysql='''describe w3i.%s'''%(table)
dbx.execute(mysql); rows=dbx.fetchall()
psql='drop table %s'%(table)
DC.execute(psql); DB.commit()

psql='create table %s ('%(table)
for row in rows:
name=row[0]; type=row[1]
if 'int' in type: type='int8'
if 'blob' in type: type='bytea'
if 'datetime' in type: type='timestamptz'
psql+='%s %s,'%(name,type)
psql=psql.strip(',')+')'
print psql
try: DC.execute(psql); DB.commit()
except: pass

msql='''select * from w3i.%s'''%(table)
dbx.execute(msql); rows=dbx.fetchall()
n=len(rows); print n; t=n
if n==0: continue #skip if no data

cols=len(rows[0])
for row in rows:
ps=', '.join(['%s']*cols)
psql='''insert into %s values(%s)'''%(table, ps)
DC.execute(psql,(row))
n=n-1
if n%1000==1: DB.commit(); print n,t,t-n
DB.commit()

如您所见——我将第 2 行更改为直接连接 MySQL

但是现在出现如下错误

python postgres.py
Traceback (most recent call last):
File "postgres.py", line 9, in <module>
dbx=Connect()
NameError: name 'Connect' is not defined

提前感谢您提供解决方法的提示!

最佳答案

编辑:我忘记了光标...

EDIT2:原始脚本没有正确处理 TINYTEXT、MEDIUMTEXT 或 LONGTEXT 类型的字段 => 添加了到 PostgreSQL TEXT 类型的转换

EDIT3:原始脚本不处理 ENUM 字段,阻塞在非 7 位字符上,并且有错误的错误管理

您注释掉了定义 Connect 的第 2 行,但您未修改使用 Connect() 的第 9 行,因此出现错误。

当您现在明确连接到 MySQL 时,您应该将 dbx = Connect() 替换为:

dbx = db.cursor()

现在应该给出(第 28 行 TEXT 类型的转换):

import MySQLdb
#from magic import Connect #Private mysql connect information - I COMMENTED THIS LINE to use direct connection
db = MySQLdb.connect(host="localhost", # your host, usually localhost
user="USER", # your username
passwd="PASS", # your password
db="w3i") # name of the data base
import psycopg2

# set client_encoding if different that PostgreSQL database default
encoding = 'Latin1'

dbx=db.cursor()
DB=psycopg2.connect("dbname='w3i'")
DC=DB.cursor()
DC.execute("set client_encoding = " + encoding)

mysql='''show tables from w3i'''
dbx.execute(mysql); ts=dbx.fetchall(); tables=[]
for table in ts: tables.append(table[0])
for table in tables:
mysql='''describe w3i.%s'''%(table)
dbx.execute(mysql); rows=dbx.fetchall()
psql='drop table %s'%(table)
DC.execute(psql); DB.commit()

psql='create table %s ('%(table)
for row in rows:
name=row[0]; type=row[1]
if 'int' in type: type='int8'
if 'blob' in type: type='bytea'
if 'datetime' in type: type='timestamptz'
if 'text' in type: type='text'
if 'enum' in type:
type = 'varchar'
print ("warning : conversion of enum to varchar %s(%s)" % (table, name))
psql+='%s %s,'%(name,type)
psql=psql.strip(',')+')'
print psql
try: DC.execute(psql); DB.commit()
except Exception as e:
print e
DB.rollback()

上面的脚本convert enum to VARCHAR。如果你只有一种枚举类型,你可以尝试在 PostgreSQL 端创建它:

DC.execute("DROP TYPE IF EXISTS enumtyp CASCADE")
DC.execute("CREATE TYPE enumtyp AS ENUM( ... )"

其中 enumtyp 是类型的名称,... 是(文本)值列表(如果字段在 MySQL 中可以为空)

然后通过将行 type = 'varchar' 替换为 enumtype 来替换 enum :

        if 'enum' in type:
type = 'enumtyp'

关于将mysql导入postgresql的Python脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27035908/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com