SQLAlchemy在两个DB之间插入Select中的数据

时间:2018-02-14 07:02:47

标签: postgresql flask sqlalchemy flask-sqlalchemy

目标是:

  1. 能够使用SQLAlchemy
  2. 绑定到两个单独的PostgreSQL数据库
  3. 从数据库的一个表中选择并插入到另一个数据库中。
  4. 两个数据库的表模式相同。

    这是一个烧瓶应用程序,我无法控制外部数据库。我只能读取它,如上所述,我想将数据插入内部数据库。

    这是我到目前为止所提出的。

    设置

    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号目标?

    谢谢。

0 个答案:

没有答案