recherche

Maison  >  Questions et réponses  >  le corps du texte

python - flask-sqlalchemy怎么操作postgresql中不同schema(默认是public)

1.现在我的postgresql中有多个schema

现在使用sqlalchemy中URI
postgresql://postgres:111111@127.0.0.1:5432/db
连接上的数据库中默认是在public这个schema下的,
我怎么使用stage这个schema呢?

ringa_leeringa_lee2805 Il y a quelques jours1140

répondre à tous(2)je répondrai

  • 巴扎黑

    巴扎黑2017-04-17 17:41:22

    Lors de l'interrogation de la table, apportez le préfixe du schéma, tel que

     select xxx from stage.table_name where ...; 

    répondre
    0
  • ringa_lee

    ringa_lee2017-04-17 17:41:22

    2 situations :

    1 : Définir manuellement le modèle

    class Test(db.Model):
        __tablename__ = 'test'
        __table_args__ = {
            'schema': 'other_schema'
        }
        id = db.Column('test_id', db.String(12), primary_key=True, )
        name = db.Column('test_name', db.String(10))
    

    Lors de la définition manuelle du modèle, ajoutez le paramètre __table_args__ pour spécifier le schéma utilisé par le modèle

    2 : Refléter une table du schéma dans le modèle

    J'utilise la fonction factory pour générer des instances Flask.

    En fonction usine :

    def create_app(config_name):
        app = Flask(__name__)
        app.config.from_object(config[config_name])
        CORS(app)
        config[config_name].init_app(app)
        db.init_app(app)
        # 总觉得这里的实现不是很好 有更好的解决方案请告知
        tables = [‘test’]
        op = getattr(db.Model.metadata, ‘reflect’)
        op(bind=db.get_engine(app), only=tables, schema=’other_schema’)
    
        login_manager.init_app(app)
        from .hello import hello
        from .auth import auth
        app.register_blueprint(hello)
        app.register_blueprint(auth)
    
        return app
    

    Définition du modèle de réflexion :

    class Test(db.Model):
        __tablename__ = ‘other_schema.test’
        
        # 有时后数据表设计时没有主键,但SQLAlchemy需要有主键,对于这类表我们需要重新指定主键:
        # 这里有时候需要用 __mapper_args__ 指定这张表的primary_key是哪个
        __mapper_args__ = {
        ‘primary_key’: [db.Model.metadata.tables[‘other_schema.test’].c.id]
        }
    

    Ensuite, vous pouvez utiliser ORM pour faire fonctionner des tables d'autres schémas. J'ai été aux prises avec ce problème pendant la majeure partie de la journée, j'espère que cela pourra aider les personnes dans le besoin.

    répondre
    0
  • Annulerrépondre