insert_from 超过两个数据库
insert_from over two databases
我尝试将所有行从一个数据库table(源)移动到另一个数据库(目标)。 source-DB 是一个本地数据库,而 target-DB 运行s 在另一台机器上。我想在两个数据库之间传输行,并找到了该任务的 Model.insert_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`', [])
当我 运行 在我的 table 上查询 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
我拼命搜索但没有找到任何提示,为什么我的结果是空的。
有人知道更多或更好的方法吗?
如果这是一次性操作,我建议使用 mysqldump
,然后将文件复制到远程服务器并使用 mysql
客户端获取转储文件。
如果这需要一个持续的过程,请查看 MySQL 复制。
要批量传输它,您需要遍历 SELECT
的结果集并将其放入 INSERT
语句中,因为它们位于不同的服务器上。
Peewee 无法在两个不同的数据库之间插入数据 servers/connections。但是,如果两个数据库都在同一台服务器上,您可以使用 "schema" Meta 选项从单个连接引用每个数据库,并以这种方式执行 INSERT FROM:
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'
如果数据库位于不同的服务器上,那么您别无选择,只能转储并重新加载。
我尝试将所有行从一个数据库table(源)移动到另一个数据库(目标)。 source-DB 是一个本地数据库,而 target-DB 运行s 在另一台机器上。我想在两个数据库之间传输行,并找到了该任务的 Model.insert_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`', [])
当我 运行 在我的 table 上查询 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
我拼命搜索但没有找到任何提示,为什么我的结果是空的。
有人知道更多或更好的方法吗?
如果这是一次性操作,我建议使用 mysqldump
,然后将文件复制到远程服务器并使用 mysql
客户端获取转储文件。
如果这需要一个持续的过程,请查看 MySQL 复制。
要批量传输它,您需要遍历 SELECT
的结果集并将其放入 INSERT
语句中,因为它们位于不同的服务器上。
Peewee 无法在两个不同的数据库之间插入数据 servers/connections。但是,如果两个数据库都在同一台服务器上,您可以使用 "schema" Meta 选项从单个连接引用每个数据库,并以这种方式执行 INSERT FROM:
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'
如果数据库位于不同的服务器上,那么您别无选择,只能转储并重新加载。