目标是:
两个数据库的表模式相同。
这是一个烧瓶应用程序,我无法控制外部数据库。我只能读取它,如上所述,我想将数据插入内部数据库。
这是我到目前为止所提出的。
db_internal = 'postgresql://internal:password@postgres_1:5432/internal'
db_external = 'postgresql://external:password@postgres_2:5432/external'
SQLALCHEMY_DATABASE_URI = db_internal
SQLALCHEMY_TRACK_MODIFICATIONS = False
SQLALCHEMY_BINDS = {
'internal': db_internal,
'external': db_external
}
class TemplateTable(object):
id = db.Column(db.BigInteger, unique=True, primary_key=True, nullable=False)
u_no = db.Column(db.String, nullable=True)
u_age = db.Column(db.Integer, nullable=True)
u_gender = db.Column(db.String, nullable=True)
(我无法控制但只能选择的那个)
class ExternalView(TemplateTable, db.Model):
__bind_key__ = 'external'
__tablename__ = 'external_table'
@classmethod
def selection(cls, cols, start, end):
q = db.select(cols).where(
and_(
ExternalView.id > int(start),
ExternalView.id <= int(end)
)
)
return q
(我要插入数据的那个)
class InternalTable(TemplateTable, db.Model):
__bind_key__ = 'internal'
__tablename__ = 'internal_table'
@classmethod
def insert_from_select(cls, start, end, data):
cols = [ExternalView.id, ExternalView.u_no, ExternalView.u_age, ExternalView.u_gender]
sel = ExternalView.selection(cols, start, end)
q = InternalTable.__table__.insert().from_select(['id', 'u_no', 'u_age', 'u_gender'], sel)
db.session.execute(q, data)
db.session.commit()
return True
通过这种设置,在实现目标1时绝对没有问题。
但是,对于目标2,在调用insert_from_select
时,我收到以下错误:
postgres_1 | ERROR: relation "external_table" does not exist at character 178
postgres_1 | STATEMENT: INSERT INTO internal_table (id, u_no, u_age, u_gender) SELECT external_table.id, external_table.u_no, external_table.u_age, external_table.u_gender
postgres_1 | FROM external_table
postgres_1 | WHERE external_table.id > 0 AND external_table.id <= 6
我如何实现2号目标?
谢谢。