从两个以上的数据库插入

py49o6xq  于 2021-06-23  发布在  Mysql
关注(0)|答案(2)|浏览(369)

我尝试将所有行从一个数据库表(源)移动到另一个数据库(目标)。源数据库是本地数据库,而目标数据库在另一台计算机上运行。我想在两个数据库之间传输行,并找到了该任务的model.insert\u from()方法。不幸的是,它什么也没做,我找不到任何理由。
数据库模型为:

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'

因此,我的任务应该运行在:

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

结果mysql查询是这样的,如您所见,所选数据为空[]:

('INSERT INTO `users` (`crdate`, `description`, `first_name`) SELECT `t1`.`crdate`, `t1`.`description`, `t1`.`first_name` FROM `users` AS `t1`', [])

在我的表上运行select查询时,它会输出:

SELECT `t1`.`crdate`, `t1`.`description`, `t1`.`first_name` FROM `users` AS `t1`;

2018-08-12 16:50:36 valid   Heinz
2018-08-12 19:34:45 valid   Hilde
2018-08-12 19:33:31 invalid Paul

我拼命搜索,但没有找到任何提示,为什么我的结果是空的。
有人知道更多或更好的方法吗?

kmynzznz

kmynzznz1#

如果这是一次性操作,我建议使用 mysqldump 然后将文件复制到远程服务器,并使用 mysql 客户。
如果这需要一个连续的过程,请查看mysql复制。
要批量传输它,您需要遍历 SELECT 把这个放进 INSERT 语句,因为它们在不同的服务器上。

mwecs4sa

mwecs4sa2#

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

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'

如果数据库在不同的服务器上,那么除了转储和重新加载之外,您别无选择。

相关问题