Bienvenido a la Comunidad de Treehouse
¿Quieres colaborar en errores de código? ¿Tienes errores que necesitan comentarios? ¿Buscas un par de ojos adicionales en tu último proyecto? aquí.
¿Buscas aprender algo nuevo?
Treehouse ofrece una prueba gratuita de siete días para estudiantes nuevos. Obtén acceso a miles de horas de contenido y únete a miles de
Inicia tu prueba gratuita
David Hultén
8.327 PuntosLa consola dice que hay una incompatibilidad con SQLAlchemy2.0 y no sé cómo solucionarlo
aquí está mi código y cuando lo ejecuto en la consola dice que el argumento declarative_base() es incompatible con SQLAlchemy2.0
# Animales
# ID | Nombre | Hábitat
# Registro del Cuidador de Zoológico
# ID | ID de Animal (Clave Foránea) | Notas
from sqlalchemy import (create_engine, Column, Integer,
String, ForeignKey)
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker, relationship
engine = create_engine("sqlite:///zoo.db", echo=False)
Session = sessionmaker(bind=engine)
session = Session()
Base = declarative_base()
class Animal(Base):
__tablename__ = "animals"
id = Column(Integer, primary_key=True)
name = Column(String)
habitat = Column(String)
logs = relationship("Logbook", back_populates="animal")
def __repr__(self):
return f"""
\nAnimal {self.id}\r
Name = {self.name}\r
Habitat = {self.habitat}
"""
class Logbook(Base):
__tablename__ = "logbook"
id = Column(Integer, primary_key=True)
animal_id = Column(Integer, ForeignKey("animals.id"))
notes = Column(String)
animal = relationship("Animal", back_populates= "logs")
def __repr__(self):
return f"""
\nLogbook {self.id}\r
Animal ID = {self.animal_id}\r
Notes = {self.notes}
"""
if __name__ == "__main__":
Base.metadata.create_all(engine)
3 Respuestas
Brian Jensen
Profesor de TreehouseSí, David Hultén, ¡eso es exactamente lo que quería! ⭐
Hay un par de problemas. El primero es que, por alguna razón, tu archivo incluye un número muy grande de paquetes innecesarios: requirements.txt aniso8601==10.0.1
argon2-cffi==21.3.0
asgiref==3.8.1
bcrypt==4.3.0
certifi==2025.6.15
charset-normalizer==3.4.2
click==8.1.8
contourpy==1.3.0
coverage==7.2.3
cycler==0.12.1
Deprecated==1.2.18
Django==3.2.19
django-bootstrap3==23.1
django-braces==1.15.0
django_debug_toolbar==3.8.1
djangorestframework==3.14.0
et_xmlfile==2.0.0
et_xmlfile==2.0.0
flake8==5.0.4
Flask==2.0.3
Flask-Bcrypt==1.0.1
Flask-HTTPAuth==4.7.0
Flask-Limiter==3.3.1
Flask-Login==0.6.2
Flask-RESTful==0.3.9
Flask-WTF==1.1.1
fonttools==4.58.4
greenlet==3.2.3
idna==3.10
importlib_resources==6.5.2
itsdangerous==2.0.1
Jinja2==3.1.6
kiwisolver==1.4.7
limits==4.2
markdown-it-py==3.0.0
markdown2==2.4.8
MarkupSafe==3.0.2
matplotlib==3.7.1
mccabe==0.7.0
mdurl==0.1.2
misaka==2.1.1
newrelic==8.8.0
numpy==1.24.3
openpyxl==3.1.2
ordered-set==4.1.0
packaging==24.2
pandas==1.5.3
peewee==3.16.2
pep8==1.7.1
Pillow==9.5.0
prettytable==3.6.0
pycodestyle==2.9.1
pycparser==2.21
pyflakes==2.5.0
Pygments==2.19.1
pyinotify==0.9.6
pyparsing==3.2.3
python-dateutil==2.9.0.post0
pytz==2025.2
requests==2.31.0
rich==13.9.4
six==1.17.0
SQLAlchemy==1.4.47
sqlparse==0.4.4
typing_extensions==4.14.0
urllib3==2.4.0
wcwidth==0.2.13
Werkzeug==2.0.3
wrapt==1.17.2
WTForms==3.2.1
zipp==3.23.0
Uno de estos paquetes es SQLAlchemy v1.4.47, lo que explica tu error más reciente:
ImportError: cannot import name 'DeclarativeBase' from 'sqlalchemy.orm'
Como discutimos anteriormente, esa clase se introdujo en SQLAlchemy v2.0.
Puedes seguir estos pasos para resolver los problemas y poder ejecutar SQLAlchemy v2.0 con tu actualizado model.py archivo:
1) En tu espacio de trabajo, delete el __pycache__ y env carpetas, así como el requirements.txt y zoo.db archivos
2) Ejecuta el python3 -m venv env comando en la Consola para inicializar un nuevo entorno.
3) Ejecuta el source ./env/bin/activate comando en la Consola para activar el entorno.
4) Ejecuta el pip install sqlalchemy comando en la Consola para instalar la versión más reciente de SQLAlchemy.
5) Ejecuta el pip freeze > requirements.txt comando en la Consola para generar un nuevo archivo requirements.txt.
6) Haz clic derecho en el models.py archivo en la barra lateral izquierda, luego haz clic en Actualizar en el menú emergente.
7) Ahora deberías ver el recreado requirements.txt archivo, que ahora solo debe contener estos tres paquetes: greenlet==3.2.5, sqlalchemy==2.0.49y typing-extensions==4.15.0
8) Ejecuta el python3 models.py comando en la Consola para generar el zoo.db archivo. Esto ahora debería ejecutarse sin errores. Actualiza la barra lateral izquierda nuevamente, y el creado exitosamente zoo.db archivo debería aparecer.
Si tienes algún problema con estos pasos, adelante y crea una nueva captura de pantalla y comparte el enlace aquí.
Brian Jensen
Profesor de TreehouseHola David Hultén
Ah, sí, en 2.0 la declarative_base() función se convirtió en una Clase y se movió a orm en su lugar. Solo hay un par de pequeños cambios que necesitas hacer en tu código para que funcione con 2.0+.
1) Eliminar línea 8 completamente:
from sqlalchemy.ext.declarative import declarative_base
2) Luego, cambia la línea 9 para incluir la DeclarativeBase Clase como parte de las importaciones:
from sqlalchemy.orm import sessionmaker, relationship, DeclarativeBase
3) Por último, cambia la línea 15 de una función:
Base = declarative_base()
En una Clase:
class Base(DeclarativeBase):
pass
Después de eso, tu código debería ejecutarse correctamente, y el zoo.db archivo debería crearse exitosamente.
Otra opción, si prefieres seguir más de cerca el código del curso, es instalar la misma versión de SQLAlchemy que se está utilizando: pip install sqlalchemy==1.4.22.
¡Déjanos saber si tienes algún problema!
David Hultén
8.327 PuntosLo intenté de la manera que dijiste y obtuve este error:
File "/home/treehouse/workspace/models.py", line 8, in <module>
from sqlalchemy.orm import sessionmaker, relationship, DeclarativeBase
ImportError: cannot import name 'DeclarativeBase' from 'sqlalchemy.orm' (/usr/local/lib/pinit.py)
y aquí están las importaciones y lo que cambié:
from sqlalchemy import (create_engine, Column, Integer,
String, ForeignKey)
from sqlalchemy.orm import sessionmaker, relationship, DeclarativeBase
engine = create_engine("sqlite:///zoo.db", echo=False)
Session = sessionmaker(bind=engine)
session = Session()
class Base(DeclarativeBase):
pass
Brian Jensen
Profesor de TreehouseHola de nuevo David Hultén!
Hmm, según ese fragmento de importación parece que ahora los tienes configurados perfectamente para SQLAlchemy 2.0+.
¿Podrías compartir una copia completa de tu proyecto para que podamos revisar tu código en su totalidad, incluyendo tu archivo requirements.txt:
Si actualmente estás trabajando en tu proyecto en Treehouse Workspaces, puedes ver este vídeo para compartir una captura de pantalla de tu espacio de trabajo.
Si actualmente estás trabajando en tu proyecto localmente, puedes ver esto Flujo de trabajo de Git y GitHub para desarrolladores taller para compartir un repositorio de tu proyecto en GitHub.
Entonces podemos localizar mejor el problema.
David Hultén
8.327 Puntosespero que esto sea lo que querías https://w.trhou.se/s5cxd7tdtf