import os
from sqlalchemy import create_engine
from sqlalchemy.orm import scoped_session, sessionmaker
engine=create_engine(os.getenv("DATABASE_URL"))
db = scoped_session(sessionmaker(bind=engine))
def main():
flights = db.execute("SELECT origin, destination, duration FROM flights").fetchall()
for flight in flights:
print(f"{flight.origin} to {flight.destination}, {flight.duration} minutes.")
if __name__ == "__main__":
main()
Traceback (most recent call last):
File "list.py", line 6, in
engine=create_engine(os.getenv("DATABASE_URL"))
File "C:\Users\Aakash\AppData\Local\Programs\Python\Python38-32\lib\site-packages\sqlalchemy\engine__init__.py",
line 479, in create_engine
return strategy.create(*args, **kwargs)
File "C:\Users\Aakash\AppData\Local\Programs\Python\Python38-32\lib\site-packages\sqlalchemy\engine\strategies.py", line 56, in create
plugins = u._instantiate_plugins(kwargs)
AttributeError: 'NoneType' object has no attribute '_instantiate_plugins'And if change my code to: The Problem and the traceback is in the picture.
4 Réponses :
Il semble que os.getenv ("DATABASE_URL") renvoie None . L'appel de create_engine (None) vous donne cette erreur. DATABASE_URL est-il défini dans votre variable d'environnement?
utilisez simplement ceci comme URL
"postgresql: // nom d'utilisateur: mot de passe @ hôte: port / base de données"
passez directement ces valeurs dans votre create_engine("postgresql://username:password@host:port/database")
J'avais le même problème maintenant, c'est parti. Cela a fonctionné pour moi. La seule chose importante à mentionner est que j'ai eu une erreur complètement différente après avoir créé le nouvel utilisateur et la nouvelle base de données et déplacé les tables. L'erreur était "
'' ModuleNotFoundError: Aucun module nommé 'psycopg2' '' '
et la solution était en cours d'exécution: pip3 install psycopg2-binary
PS: détails de l'URL avec vos détails.
au lieu de
engine = create_engine("postgresql://scott:tiger@localhost/mydatabase")
db = scoped_session(sessionmaker(bind=engine))
saisissez ceci avec votre URL:
engine=create_engine(os.getenv("DATABASE_URL"))
db = scoped_session(sessionmaker(bind=engine))
Pour éviter de taper votre connexion postgresql (y compris le mot de passe) dans votre code définissez votre variable d'environnement dans votre terminal selon ceci:
. ~/.bash_profile
Ou vous pouvez utiliser la forme courte de la commande: p>
source ~/.bash_profile
Ceci exécute le fichier .bash_profile dans le shell actuel.
Des conseils supplémentaires concernant le rechargement du .bash_profile peuvent être trouvés dans les commentaires ici .