从两个数据库插入

时间:2018-08-13 23:38:52

标签: mysql peewee

我尝试将所有行从一个数据库表(源)移动到另一数据库(目标)。源数据库是本地数据库,而目标数据库在另一台计算机上运行。我想在两个数据库之间传输行,并找到该任务的Model.insert_from()方法。不幸的是,它什么也没做,我找不到任何原因。

数据库模型为:

requests

有了这个,我的任务应该运行:

send

由此产生的MySQL查询是您所看到的,所选数据为空[]:

databaseSource = MySQLDatabase('sourceDB', **{'host': 'localhost', 'user': 'local', 'password': ''})

databaseTarget = MySQLDatabase('targetDB', **{'host': 'externalserver', 'user': 'external', 'password': ''})

class BaseModelSource(Model):
    class Meta:
        database = databaseSource
class BaseModelTarget(Model):
    class Meta:
        database = databaseTarget

class UsersSource(BaseModelSource):
    crdate = DateTimeField(constraints=[SQL("DEFAULT CURRENT_TIMESTAMP")])
    description = TextField()
    firstName = CharField(column_name='first_name')

    class Meta:
        table_name = 'users'

class UsersTarget(BaseModelTarget):
    crdate = DateTimeField(constraints=[SQL("DEFAULT CURRENT_TIMESTAMP")])
    description = TextField()
    firstName = CharField(column_name='first_name')

    class Meta:
        table_name = 'users'

当我在表上运行SELECT查询时,它输出:

import peewee
from dbmodels import *

dataQuery = UsersSource.select(
    UsersSource.crdate, 
    UsersSource.description,
    UsersSource.firstName)

insertQuery = UsersTarget.insert_from(dataQuery,[
    UsersTarget.crdate, 
    UsersTarget.description,
    UsersTarget.firstName]).execute()

我搜索像地狱一样,但没有找到任何提示,为什么我的结果为空。

有人知道更多还是更好的方法?

2 个答案:

答案 0 :(得分:0)

如果这是一次性操作,建议您使用mysqldump,然后将文件复制到远程服务器,并使用mysql客户端获取转储的文件。

如果这是一个连续的过程,请查看MySQL复制。

要进行批量传输,您需要遍历SELECT的结果集,并将其放入INSERT语句中,因为它们位于不同的服务器上。

答案 1 :(得分:0)

Peewee无法在两个不同的数据库服务器/连接之间插入数据。但是,如果两个数据库都在同一台服务器上,则可以使用“ schema” Meta选项从单个连接中引用每个数据库,并通过这种方式执行INSERT:

db = MySQLDatabase('my_db')

class UsersSource(Model):
    crdate = DateTimeField(constraints=[SQL("DEFAULT CURRENT_TIMESTAMP")])
    description = TextField()
    firstName = CharField(column_name='first_name')

    class Meta:
        database = db
        schema = 'source_db_name'
        table_name = 'users'

class UsersTarget(Model):
    crdate = DateTimeField(constraints=[SQL("DEFAULT CURRENT_TIMESTAMP")])
    description = TextField()
    firstName = CharField(column_name='first_name')

    class Meta:
        database = db
        schema = 'dest_db_name'
        table_name = 'users'

如果数据库位于不同的服务器上,那么除了将其转储然后重新加载外,您别无选择。