model.py 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. """Database built into Pynecone."""
  2. import sqlmodel
  3. from pynecone.base import Base
  4. from pynecone.config import get_config
  5. def get_engine():
  6. """Get the database engine.
  7. Returns:
  8. The database engine.
  9. Raises:
  10. ValueError: If the database url is None.
  11. """
  12. url = get_config().db_url
  13. if not url:
  14. raise ValueError("No database url in config")
  15. return sqlmodel.create_engine(url, echo=False)
  16. class Model(Base, sqlmodel.SQLModel):
  17. """Base class to define a table in the database."""
  18. # The primary key for the table.
  19. id: int = sqlmodel.Field(primary_key=True)
  20. def dict(self, **kwargs):
  21. """Convert the object to a dictionary.
  22. Args:
  23. kwargs: Ignored but needed for compatibility.
  24. Returns:
  25. The object as a dictionary.
  26. """
  27. return {name: getattr(self, name) for name in self.__fields__}
  28. @staticmethod
  29. def create_all():
  30. """Create all the tables."""
  31. engine = get_engine()
  32. sqlmodel.SQLModel.metadata.create_all(engine)
  33. @classmethod
  34. @property
  35. def select(cls):
  36. """Select rows from the table.
  37. Returns:
  38. The select statement.
  39. """
  40. return sqlmodel.select(cls)
  41. def session(url=None):
  42. """Get a session to interact with the database.
  43. Args:
  44. url: The database url.
  45. Returns:
  46. A database session.
  47. """
  48. if url is not None:
  49. return sqlmodel.Session(sqlmodel.create_engine(url))
  50. engine = get_engine()
  51. return sqlmodel.Session(engine)