Improper UUID serialisation dropping leading zeros ▶️ "ValueError: badly formed hexadecimal UUID string" #25

Description

@andrewbolster

First Check

  • I added a very descriptive title to this issue.
  • I used the GitHub search to find a similar issue and didn't find it.
  • I searched the SQLModel documentation, with the integrated search.
  • I already searched in Google "How to X in SQLModel" and didn't find any information.
  • I already read and followed all the tutorial in the docs and didn't find an answer.
  • I already checked if it is not related to SQLModel but to Pydantic.
  • I already checked if it is not related to SQLModel but to SQLAlchemy.

Commit to Help

  • I commit to help with one of those options 👆

Example Code

importuuidfromtypingimportOptionalimportsqlalchemy.excfromsqlmodelimportSQLModel, Fieldfromsqlmodelimportcreate_engine, Session, selectclassHero(SQLModel, table=True):
id: Optional[uuid.UUID] =Field(primary_key=True,
default_factory=uuid.uuid4)
name: strsecret_name: strage: Optional[int] =Nonedef__str__(self):
returnf'{self.name} (AKA {self.secret_name}) [{self.ageifself.ageisnotNoneelse"Unknown"}]'sqlite_file_name="database.db"sqlite_url=f"sqlite:///{sqlite_file_name}"engine=create_engine(sqlite_url, echo=True) # remove echo for proddefcreate_db_and_tables():
try:
Hero.__table__.drop(engine)
exceptsqlalchemy.exc.OperationalError: # table doesn't exist yetpassSQLModel.metadata.create_all(engine)
defcreate_heroes():
heros= [
Hero(name="Deadpond", secret_name="Dive Wilson"),
Hero(name="Spider-Boy", secret_name="Pedro Parqueador"),
Hero(name="Rusty-Man", secret_name="Tommy Sharp", age=48),
Hero(name="Tarantula", secret_name="Natalia Roman-on", age=32),
Hero(name="Black Lion", secret_name="Trevor Challa", age=35),
Hero(name="Dr. Weird", secret_name="Steve Weird", age=36),
Hero(name="Captain North America", secret_name="Esteban Rogelios", age=93),
]
withSession(engine) assession:
forheroinheros:
session.add(hero)
session.commit()
defselect_heroes():
withSession(engine) assession:
forheroinsession.exec(select(Hero)):
print(hero.id)
if__name__=="__main__":
whileTrue:
try:
create_db_and_tables()
create_heroes()
select_heroes()
exceptValueError:
raise

Cleansed Traceback

Traceback (most recent call last):
File “/…/sqlmodel_tutorial/minimal_example.py", line 89, in <module>
select_heroes()
File “/…/sqlmodel_tutorial/minimal_example.py", line 80, in select_heroes
for hero in session.exec(select(Hero)):
File "/.../lib/python3.8/site-packages/sqlalchemy/engine/result.py", line 381, in iterrows
for row in self._fetchiter_impl():
File "/.../lib/python3.8/site-packages/sqlalchemy/orm/loading.py", line 147, in chunks
fetch = cursor._raw_all_rows()
File "/.../lib/python3.8/site-packages/sqlalchemy/engine/result.py", line 392, in _raw_all_rows
return [make_row(row) for row in rows]
File "/.../lib/python3.8/site-packages/sqlalchemy/engine/result.py", line 392, in <listcomp>
return [make_row(row) for row in rows]
File "/.../lib/python3.8/site-packages/sqlalchemy/sql/type_api.py", line 1430, in process
return process_value(value, dialect)
File "/.../lib/python3.8/site-packages/sqlmodel/sql/sqltypes.py", line 61, in process_result_value
value = uuid.UUID(value)
File “/…/lib/python3.8/uuid.py", line 171, in __init__
raise ValueError('badly formed hexadecimal UUID string')
ValueError: badly formed hexadecimal UUID string

Description

Running through the tutorial up until around this point, I tried swapping out the int id key for a UUID key.

This works except whenever the uuid.uuid4 default factory creates a UUID with a hexstring that starts with a zero.

It appears that here in sqltypes.py that, rather than using UUID().hex, sqltypes.py carries on sqlalchemy's integer stringification apprach, however, doesn't include any padding declaration.

IMO there are two options;

  1. faithfully fix the replication of SQLAlchemy's UUID▶️int▶️str approach with the padding fixed (f"{v.int:032x}")
  2. switch to using the stdlib UUID.hex implementation for serialisation

Personally I'm a fan of the latter so will spin up a PR

Operating System

macOS

Operating System Details

No response

SQLModel Version

0.0.4

Python Version

3.8.8

Additional Context

No response

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions

      , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
       blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
      }
      } catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
      })();
      (function(){
      try {
      var __m = "github.com";
      var __re = new RegExp('^' + "github\\.com" + '
      
      Skip to content

      Improper UUID serialisation dropping leading zeros ▶️ "ValueError: badly formed hexadecimal UUID string" #25

      Description

      @andrewbolster

      First Check

      • I added a very descriptive title to this issue.
      • I used the GitHub search to find a similar issue and didn't find it.
      • I searched the SQLModel documentation, with the integrated search.
      • I already searched in Google "How to X in SQLModel" and didn't find any information.
      • I already read and followed all the tutorial in the docs and didn't find an answer.
      • I already checked if it is not related to SQLModel but to Pydantic.
      • I already checked if it is not related to SQLModel but to SQLAlchemy.

      Commit to Help

      • I commit to help with one of those options 👆

      Example Code

      importuuidfromtypingimportOptionalimportsqlalchemy.excfromsqlmodelimportSQLModel, Fieldfromsqlmodelimportcreate_engine, Session, selectclassHero(SQLModel, table=True):
      id: Optional[uuid.UUID] =Field(primary_key=True,
      default_factory=uuid.uuid4)
      name: strsecret_name: strage: Optional[int] =Nonedef__str__(self):
      returnf'{self.name} (AKA {self.secret_name}) [{self.ageifself.ageisnotNoneelse"Unknown"}]'sqlite_file_name="database.db"sqlite_url=f"sqlite:///{sqlite_file_name}"engine=create_engine(sqlite_url, echo=True) # remove echo for proddefcreate_db_and_tables():
      try:
      Hero.__table__.drop(engine)
      exceptsqlalchemy.exc.OperationalError: # table doesn't exist yetpassSQLModel.metadata.create_all(engine)
      defcreate_heroes():
      heros= [
      Hero(name="Deadpond", secret_name="Dive Wilson"),
      Hero(name="Spider-Boy", secret_name="Pedro Parqueador"),
      Hero(name="Rusty-Man", secret_name="Tommy Sharp", age=48),
      Hero(name="Tarantula", secret_name="Natalia Roman-on", age=32),
      Hero(name="Black Lion", secret_name="Trevor Challa", age=35),
      Hero(name="Dr. Weird", secret_name="Steve Weird", age=36),
      Hero(name="Captain North America", secret_name="Esteban Rogelios", age=93),
      ]
      withSession(engine) assession:
      forheroinheros:
      session.add(hero)
      session.commit()
      defselect_heroes():
      withSession(engine) assession:
      forheroinsession.exec(select(Hero)):
      print(hero.id)
      if__name__=="__main__":
      whileTrue:
      try:
      create_db_and_tables()
      create_heroes()
      select_heroes()
      exceptValueError:
      raise

      Cleansed Traceback

      Traceback (most recent call last):
      File “/…/sqlmodel_tutorial/minimal_example.py", line 89, in <module>
      select_heroes()
      File “/…/sqlmodel_tutorial/minimal_example.py", line 80, in select_heroes
      for hero in session.exec(select(Hero)):
      File "/.../lib/python3.8/site-packages/sqlalchemy/engine/result.py", line 381, in iterrows
      for row in self._fetchiter_impl():
      File "/.../lib/python3.8/site-packages/sqlalchemy/orm/loading.py", line 147, in chunks
      fetch = cursor._raw_all_rows()
      File "/.../lib/python3.8/site-packages/sqlalchemy/engine/result.py", line 392, in _raw_all_rows
      return [make_row(row) for row in rows]
      File "/.../lib/python3.8/site-packages/sqlalchemy/engine/result.py", line 392, in <listcomp>
      return [make_row(row) for row in rows]
      File "/.../lib/python3.8/site-packages/sqlalchemy/sql/type_api.py", line 1430, in process
      return process_value(value, dialect)
      File "/.../lib/python3.8/site-packages/sqlmodel/sql/sqltypes.py", line 61, in process_result_value
      value = uuid.UUID(value)
      File “/…/lib/python3.8/uuid.py", line 171, in __init__
      raise ValueError('badly formed hexadecimal UUID string')
      ValueError: badly formed hexadecimal UUID string
      

      Description

      Running through the tutorial up until around this point, I tried swapping out the int id key for a UUID key.

      This works except whenever the uuid.uuid4 default factory creates a UUID with a hexstring that starts with a zero.

      It appears that here in sqltypes.py that, rather than using UUID().hex, sqltypes.py carries on sqlalchemy's integer stringification apprach, however, doesn't include any padding declaration.

      IMO there are two options;

      1. faithfully fix the replication of SQLAlchemy's UUID▶️int▶️str approach with the padding fixed (f"{v.int:032x}")
      2. switch to using the stdlib UUID.hex implementation for serialisation

      Personally I'm a fan of the latter so will spin up a PR

      Operating System

      macOS

      Operating System Details

      No response

      SQLModel Version

      0.0.4

      Python Version

      3.8.8

      Additional Context

      No response

      Metadata

      Metadata

      Assignees

      No one assigned

        Labels

        bugSomething isn't working

        Type

        No type

        Projects

        No projects

          Milestone

          No milestone

          Relationships

          None yet

          Development

          No branches or pull requests

          Issue actions

          , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
          Skip to content

          Improper UUID serialisation dropping leading zeros ▶️ "ValueError: badly formed hexadecimal UUID string" #25

          Description

          @andrewbolster

          First Check

          • I added a very descriptive title to this issue.
          • I used the GitHub search to find a similar issue and didn't find it.
          • I searched the SQLModel documentation, with the integrated search.
          • I already searched in Google "How to X in SQLModel" and didn't find any information.
          • I already read and followed all the tutorial in the docs and didn't find an answer.
          • I already checked if it is not related to SQLModel but to Pydantic.
          • I already checked if it is not related to SQLModel but to SQLAlchemy.

          Commit to Help

          • I commit to help with one of those options 👆

          Example Code

          importuuidfromtypingimportOptionalimportsqlalchemy.excfromsqlmodelimportSQLModel, Fieldfromsqlmodelimportcreate_engine, Session, selectclassHero(SQLModel, table=True):
          id: Optional[uuid.UUID] =Field(primary_key=True,
          default_factory=uuid.uuid4)
          name: strsecret_name: strage: Optional[int] =Nonedef__str__(self):
          returnf'{self.name} (AKA {self.secret_name}) [{self.ageifself.ageisnotNoneelse"Unknown"}]'sqlite_file_name="database.db"sqlite_url=f"sqlite:///{sqlite_file_name}"engine=create_engine(sqlite_url, echo=True) # remove echo for proddefcreate_db_and_tables():
          try:
          Hero.__table__.drop(engine)
          exceptsqlalchemy.exc.OperationalError: # table doesn't exist yetpassSQLModel.metadata.create_all(engine)
          defcreate_heroes():
          heros= [
          Hero(name="Deadpond", secret_name="Dive Wilson"),
          Hero(name="Spider-Boy", secret_name="Pedro Parqueador"),
          Hero(name="Rusty-Man", secret_name="Tommy Sharp", age=48),
          Hero(name="Tarantula", secret_name="Natalia Roman-on", age=32),
          Hero(name="Black Lion", secret_name="Trevor Challa", age=35),
          Hero(name="Dr. Weird", secret_name="Steve Weird", age=36),
          Hero(name="Captain North America", secret_name="Esteban Rogelios", age=93),
          ]
          withSession(engine) assession:
          forheroinheros:
          session.add(hero)
          session.commit()
          defselect_heroes():
          withSession(engine) assession:
          forheroinsession.exec(select(Hero)):
          print(hero.id)
          if__name__=="__main__":
          whileTrue:
          try:
          create_db_and_tables()
          create_heroes()
          select_heroes()
          exceptValueError:
          raise

          Cleansed Traceback

          Traceback (most recent call last):
          File “/…/sqlmodel_tutorial/minimal_example.py", line 89, in <module>
          select_heroes()
          File “/…/sqlmodel_tutorial/minimal_example.py", line 80, in select_heroes
          for hero in session.exec(select(Hero)):
          File "/.../lib/python3.8/site-packages/sqlalchemy/engine/result.py", line 381, in iterrows
          for row in self._fetchiter_impl():
          File "/.../lib/python3.8/site-packages/sqlalchemy/orm/loading.py", line 147, in chunks
          fetch = cursor._raw_all_rows()
          File "/.../lib/python3.8/site-packages/sqlalchemy/engine/result.py", line 392, in _raw_all_rows
          return [make_row(row) for row in rows]
          File "/.../lib/python3.8/site-packages/sqlalchemy/engine/result.py", line 392, in <listcomp>
          return [make_row(row) for row in rows]
          File "/.../lib/python3.8/site-packages/sqlalchemy/sql/type_api.py", line 1430, in process
          return process_value(value, dialect)
          File "/.../lib/python3.8/site-packages/sqlmodel/sql/sqltypes.py", line 61, in process_result_value
          value = uuid.UUID(value)
          File “/…/lib/python3.8/uuid.py", line 171, in __init__
          raise ValueError('badly formed hexadecimal UUID string')
          ValueError: badly formed hexadecimal UUID string
          

          Description

          Running through the tutorial up until around this point, I tried swapping out the int id key for a UUID key.

          This works except whenever the uuid.uuid4 default factory creates a UUID with a hexstring that starts with a zero.

          It appears that here in sqltypes.py that, rather than using UUID().hex, sqltypes.py carries on sqlalchemy's integer stringification apprach, however, doesn't include any padding declaration.

          IMO there are two options;

          1. faithfully fix the replication of SQLAlchemy's UUID▶️int▶️str approach with the padding fixed (f"{v.int:032x}")
          2. switch to using the stdlib UUID.hex implementation for serialisation

          Personally I'm a fan of the latter so will spin up a PR

          Operating System

          macOS

          Operating System Details

          No response

          SQLModel Version

          0.0.4

          Python Version

          3.8.8

          Additional Context

          No response

          Metadata

          Metadata

          Assignees

          No one assigned

            Labels

            bugSomething isn't working

            Type

            No type

            Projects

            No projects

              Milestone

              No milestone

              Relationships

              None yet

              Development

              No branches or pull requests

              Issue actions

              , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
              Skip to content

              Improper UUID serialisation dropping leading zeros ▶️ "ValueError: badly formed hexadecimal UUID string" #25

              Description

              @andrewbolster

              First Check

              • I added a very descriptive title to this issue.
              • I used the GitHub search to find a similar issue and didn't find it.
              • I searched the SQLModel documentation, with the integrated search.
              • I already searched in Google "How to X in SQLModel" and didn't find any information.
              • I already read and followed all the tutorial in the docs and didn't find an answer.
              • I already checked if it is not related to SQLModel but to Pydantic.
              • I already checked if it is not related to SQLModel but to SQLAlchemy.

              Commit to Help

              • I commit to help with one of those options 👆

              Example Code

              importuuidfromtypingimportOptionalimportsqlalchemy.excfromsqlmodelimportSQLModel, Fieldfromsqlmodelimportcreate_engine, Session, selectclassHero(SQLModel, table=True):
              id: Optional[uuid.UUID] =Field(primary_key=True,
              default_factory=uuid.uuid4)
              name: strsecret_name: strage: Optional[int] =Nonedef__str__(self):
              returnf'{self.name} (AKA {self.secret_name}) [{self.ageifself.ageisnotNoneelse"Unknown"}]'sqlite_file_name="database.db"sqlite_url=f"sqlite:///{sqlite_file_name}"engine=create_engine(sqlite_url, echo=True) # remove echo for proddefcreate_db_and_tables():
              try:
              Hero.__table__.drop(engine)
              exceptsqlalchemy.exc.OperationalError: # table doesn't exist yetpassSQLModel.metadata.create_all(engine)
              defcreate_heroes():
              heros= [
              Hero(name="Deadpond", secret_name="Dive Wilson"),
              Hero(name="Spider-Boy", secret_name="Pedro Parqueador"),
              Hero(name="Rusty-Man", secret_name="Tommy Sharp", age=48),
              Hero(name="Tarantula", secret_name="Natalia Roman-on", age=32),
              Hero(name="Black Lion", secret_name="Trevor Challa", age=35),
              Hero(name="Dr. Weird", secret_name="Steve Weird", age=36),
              Hero(name="Captain North America", secret_name="Esteban Rogelios", age=93),
              ]
              withSession(engine) assession:
              forheroinheros:
              session.add(hero)
              session.commit()
              defselect_heroes():
              withSession(engine) assession:
              forheroinsession.exec(select(Hero)):
              print(hero.id)
              if__name__=="__main__":
              whileTrue:
              try:
              create_db_and_tables()
              create_heroes()
              select_heroes()
              exceptValueError:
              raise

              Cleansed Traceback

              Traceback (most recent call last):
              File “/…/sqlmodel_tutorial/minimal_example.py", line 89, in <module>
              select_heroes()
              File “/…/sqlmodel_tutorial/minimal_example.py", line 80, in select_heroes
              for hero in session.exec(select(Hero)):
              File "/.../lib/python3.8/site-packages/sqlalchemy/engine/result.py", line 381, in iterrows
              for row in self._fetchiter_impl():
              File "/.../lib/python3.8/site-packages/sqlalchemy/orm/loading.py", line 147, in chunks
              fetch = cursor._raw_all_rows()
              File "/.../lib/python3.8/site-packages/sqlalchemy/engine/result.py", line 392, in _raw_all_rows
              return [make_row(row) for row in rows]
              File "/.../lib/python3.8/site-packages/sqlalchemy/engine/result.py", line 392, in <listcomp>
              return [make_row(row) for row in rows]
              File "/.../lib/python3.8/site-packages/sqlalchemy/sql/type_api.py", line 1430, in process
              return process_value(value, dialect)
              File "/.../lib/python3.8/site-packages/sqlmodel/sql/sqltypes.py", line 61, in process_result_value
              value = uuid.UUID(value)
              File “/…/lib/python3.8/uuid.py", line 171, in __init__
              raise ValueError('badly formed hexadecimal UUID string')
              ValueError: badly formed hexadecimal UUID string
              

              Description

              Running through the tutorial up until around this point, I tried swapping out the int id key for a UUID key.

              This works except whenever the uuid.uuid4 default factory creates a UUID with a hexstring that starts with a zero.

              It appears that here in sqltypes.py that, rather than using UUID().hex, sqltypes.py carries on sqlalchemy's integer stringification apprach, however, doesn't include any padding declaration.

              IMO there are two options;

              1. faithfully fix the replication of SQLAlchemy's UUID▶️int▶️str approach with the padding fixed (f"{v.int:032x}")
              2. switch to using the stdlib UUID.hex implementation for serialisation

              Personally I'm a fan of the latter so will spin up a PR

              Operating System

              macOS

              Operating System Details

              No response

              SQLModel Version

              0.0.4

              Python Version

              3.8.8

              Additional Context

              No response

              Metadata

              Metadata

              Assignees

              No one assigned

                Labels

                bugSomething isn't working

                Type

                No type

                Projects

                No projects

                  Milestone

                  No milestone

                  Relationships

                  None yet

                  Development

                  No branches or pull requests

                  Issue actions

                  , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
                  Skip to content

                  Improper UUID serialisation dropping leading zeros ▶️ "ValueError: badly formed hexadecimal UUID string" #25

                  Description

                  @andrewbolster

                  First Check

                  • I added a very descriptive title to this issue.
                  • I used the GitHub search to find a similar issue and didn't find it.
                  • I searched the SQLModel documentation, with the integrated search.
                  • I already searched in Google "How to X in SQLModel" and didn't find any information.
                  • I already read and followed all the tutorial in the docs and didn't find an answer.
                  • I already checked if it is not related to SQLModel but to Pydantic.
                  • I already checked if it is not related to SQLModel but to SQLAlchemy.

                  Commit to Help

                  • I commit to help with one of those options 👆

                  Example Code

                  importuuidfromtypingimportOptionalimportsqlalchemy.excfromsqlmodelimportSQLModel, Fieldfromsqlmodelimportcreate_engine, Session, selectclassHero(SQLModel, table=True):
                  id: Optional[uuid.UUID] =Field(primary_key=True,
                  default_factory=uuid.uuid4)
                  name: strsecret_name: strage: Optional[int] =Nonedef__str__(self):
                  returnf'{self.name} (AKA {self.secret_name}) [{self.ageifself.ageisnotNoneelse"Unknown"}]'sqlite_file_name="database.db"sqlite_url=f"sqlite:///{sqlite_file_name}"engine=create_engine(sqlite_url, echo=True) # remove echo for proddefcreate_db_and_tables():
                  try:
                  Hero.__table__.drop(engine)
                  exceptsqlalchemy.exc.OperationalError: # table doesn't exist yetpassSQLModel.metadata.create_all(engine)
                  defcreate_heroes():
                  heros= [
                  Hero(name="Deadpond", secret_name="Dive Wilson"),
                  Hero(name="Spider-Boy", secret_name="Pedro Parqueador"),
                  Hero(name="Rusty-Man", secret_name="Tommy Sharp", age=48),
                  Hero(name="Tarantula", secret_name="Natalia Roman-on", age=32),
                  Hero(name="Black Lion", secret_name="Trevor Challa", age=35),
                  Hero(name="Dr. Weird", secret_name="Steve Weird", age=36),
                  Hero(name="Captain North America", secret_name="Esteban Rogelios", age=93),
                  ]
                  withSession(engine) assession:
                  forheroinheros:
                  session.add(hero)
                  session.commit()
                  defselect_heroes():
                  withSession(engine) assession:
                  forheroinsession.exec(select(Hero)):
                  print(hero.id)
                  if__name__=="__main__":
                  whileTrue:
                  try:
                  create_db_and_tables()
                  create_heroes()
                  select_heroes()
                  exceptValueError:
                  raise

                  Cleansed Traceback

                  Traceback (most recent call last):
                  File “/…/sqlmodel_tutorial/minimal_example.py", line 89, in <module>
                  select_heroes()
                  File “/…/sqlmodel_tutorial/minimal_example.py", line 80, in select_heroes
                  for hero in session.exec(select(Hero)):
                  File "/.../lib/python3.8/site-packages/sqlalchemy/engine/result.py", line 381, in iterrows
                  for row in self._fetchiter_impl():
                  File "/.../lib/python3.8/site-packages/sqlalchemy/orm/loading.py", line 147, in chunks
                  fetch = cursor._raw_all_rows()
                  File "/.../lib/python3.8/site-packages/sqlalchemy/engine/result.py", line 392, in _raw_all_rows
                  return [make_row(row) for row in rows]
                  File "/.../lib/python3.8/site-packages/sqlalchemy/engine/result.py", line 392, in <listcomp>
                  return [make_row(row) for row in rows]
                  File "/.../lib/python3.8/site-packages/sqlalchemy/sql/type_api.py", line 1430, in process
                  return process_value(value, dialect)
                  File "/.../lib/python3.8/site-packages/sqlmodel/sql/sqltypes.py", line 61, in process_result_value
                  value = uuid.UUID(value)
                  File “/…/lib/python3.8/uuid.py", line 171, in __init__
                  raise ValueError('badly formed hexadecimal UUID string')
                  ValueError: badly formed hexadecimal UUID string
                  

                  Description

                  Running through the tutorial up until around this point, I tried swapping out the int id key for a UUID key.

                  This works except whenever the uuid.uuid4 default factory creates a UUID with a hexstring that starts with a zero.

                  It appears that here in sqltypes.py that, rather than using UUID().hex, sqltypes.py carries on sqlalchemy's integer stringification apprach, however, doesn't include any padding declaration.

                  IMO there are two options;

                  1. faithfully fix the replication of SQLAlchemy's UUID▶️int▶️str approach with the padding fixed (f"{v.int:032x}")
                  2. switch to using the stdlib UUID.hex implementation for serialisation

                  Personally I'm a fan of the latter so will spin up a PR

                  Operating System

                  macOS

                  Operating System Details

                  No response

                  SQLModel Version

                  0.0.4

                  Python Version

                  3.8.8

                  Additional Context

                  No response

                  Metadata

                  Metadata

                  Assignees

                  No one assigned

                    Labels

                    bugSomething isn't working

                    Type

                    No type

                    Projects

                    No projects

                      Milestone

                      No milestone

                      Relationships

                      None yet

                      Development

                      No branches or pull requests

                      Issue actions

                      , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
                      Skip to content

                      Improper UUID serialisation dropping leading zeros ▶️ "ValueError: badly formed hexadecimal UUID string" #25

                      Description

                      @andrewbolster

                      First Check

                      • I added a very descriptive title to this issue.
                      • I used the GitHub search to find a similar issue and didn't find it.
                      • I searched the SQLModel documentation, with the integrated search.
                      • I already searched in Google "How to X in SQLModel" and didn't find any information.
                      • I already read and followed all the tutorial in the docs and didn't find an answer.
                      • I already checked if it is not related to SQLModel but to Pydantic.
                      • I already checked if it is not related to SQLModel but to SQLAlchemy.

                      Commit to Help

                      • I commit to help with one of those options 👆

                      Example Code

                      importuuidfromtypingimportOptionalimportsqlalchemy.excfromsqlmodelimportSQLModel, Fieldfromsqlmodelimportcreate_engine, Session, selectclassHero(SQLModel, table=True):
                      id: Optional[uuid.UUID] =Field(primary_key=True,
                      default_factory=uuid.uuid4)
                      name: strsecret_name: strage: Optional[int] =Nonedef__str__(self):
                      returnf'{self.name} (AKA {self.secret_name}) [{self.ageifself.ageisnotNoneelse"Unknown"}]'sqlite_file_name="database.db"sqlite_url=f"sqlite:///{sqlite_file_name}"engine=create_engine(sqlite_url, echo=True) # remove echo for proddefcreate_db_and_tables():
                      try:
                      Hero.__table__.drop(engine)
                      exceptsqlalchemy.exc.OperationalError: # table doesn't exist yetpassSQLModel.metadata.create_all(engine)
                      defcreate_heroes():
                      heros= [
                      Hero(name="Deadpond", secret_name="Dive Wilson"),
                      Hero(name="Spider-Boy", secret_name="Pedro Parqueador"),
                      Hero(name="Rusty-Man", secret_name="Tommy Sharp", age=48),
                      Hero(name="Tarantula", secret_name="Natalia Roman-on", age=32),
                      Hero(name="Black Lion", secret_name="Trevor Challa", age=35),
                      Hero(name="Dr. Weird", secret_name="Steve Weird", age=36),
                      Hero(name="Captain North America", secret_name="Esteban Rogelios", age=93),
                      ]
                      withSession(engine) assession:
                      forheroinheros:
                      session.add(hero)
                      session.commit()
                      defselect_heroes():
                      withSession(engine) assession:
                      forheroinsession.exec(select(Hero)):
                      print(hero.id)
                      if__name__=="__main__":
                      whileTrue:
                      try:
                      create_db_and_tables()
                      create_heroes()
                      select_heroes()
                      exceptValueError:
                      raise

                      Cleansed Traceback

                      Traceback (most recent call last):
                      File “/…/sqlmodel_tutorial/minimal_example.py", line 89, in <module>
                      select_heroes()
                      File “/…/sqlmodel_tutorial/minimal_example.py", line 80, in select_heroes
                      for hero in session.exec(select(Hero)):
                      File "/.../lib/python3.8/site-packages/sqlalchemy/engine/result.py", line 381, in iterrows
                      for row in self._fetchiter_impl():
                      File "/.../lib/python3.8/site-packages/sqlalchemy/orm/loading.py", line 147, in chunks
                      fetch = cursor._raw_all_rows()
                      File "/.../lib/python3.8/site-packages/sqlalchemy/engine/result.py", line 392, in _raw_all_rows
                      return [make_row(row) for row in rows]
                      File "/.../lib/python3.8/site-packages/sqlalchemy/engine/result.py", line 392, in <listcomp>
                      return [make_row(row) for row in rows]
                      File "/.../lib/python3.8/site-packages/sqlalchemy/sql/type_api.py", line 1430, in process
                      return process_value(value, dialect)
                      File "/.../lib/python3.8/site-packages/sqlmodel/sql/sqltypes.py", line 61, in process_result_value
                      value = uuid.UUID(value)
                      File “/…/lib/python3.8/uuid.py", line 171, in __init__
                      raise ValueError('badly formed hexadecimal UUID string')
                      ValueError: badly formed hexadecimal UUID string
                      

                      Description

                      Running through the tutorial up until around this point, I tried swapping out the int id key for a UUID key.

                      This works except whenever the uuid.uuid4 default factory creates a UUID with a hexstring that starts with a zero.

                      It appears that here in sqltypes.py that, rather than using UUID().hex, sqltypes.py carries on sqlalchemy's integer stringification apprach, however, doesn't include any padding declaration.

                      IMO there are two options;

                      1. faithfully fix the replication of SQLAlchemy's UUID▶️int▶️str approach with the padding fixed (f"{v.int:032x}")
                      2. switch to using the stdlib UUID.hex implementation for serialisation

                      Personally I'm a fan of the latter so will spin up a PR

                      Operating System

                      macOS

                      Operating System Details

                      No response

                      SQLModel Version

                      0.0.4

                      Python Version

                      3.8.8

                      Additional Context

                      No response

                      Metadata

                      Metadata

                      Assignees

                      No one assigned

                        Labels

                        bugSomething isn't working

                        Type

                        No type

                        Projects

                        No projects

                          Milestone

                          No milestone

                          Relationships

                          None yet

                          Development

                          No branches or pull requests

                          Issue actions

                          , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
                          Skip to content

                          Improper UUID serialisation dropping leading zeros ▶️ "ValueError: badly formed hexadecimal UUID string" #25

                          Description

                          @andrewbolster

                          First Check

                          • I added a very descriptive title to this issue.
                          • I used the GitHub search to find a similar issue and didn't find it.
                          • I searched the SQLModel documentation, with the integrated search.
                          • I already searched in Google "How to X in SQLModel" and didn't find any information.
                          • I already read and followed all the tutorial in the docs and didn't find an answer.
                          • I already checked if it is not related to SQLModel but to Pydantic.
                          • I already checked if it is not related to SQLModel but to SQLAlchemy.

                          Commit to Help

                          • I commit to help with one of those options 👆

                          Example Code

                          importuuidfromtypingimportOptionalimportsqlalchemy.excfromsqlmodelimportSQLModel, Fieldfromsqlmodelimportcreate_engine, Session, selectclassHero(SQLModel, table=True):
                          id: Optional[uuid.UUID] =Field(primary_key=True,
                          default_factory=uuid.uuid4)
                          name: strsecret_name: strage: Optional[int] =Nonedef__str__(self):
                          returnf'{self.name} (AKA {self.secret_name}) [{self.ageifself.ageisnotNoneelse"Unknown"}]'sqlite_file_name="database.db"sqlite_url=f"sqlite:///{sqlite_file_name}"engine=create_engine(sqlite_url, echo=True) # remove echo for proddefcreate_db_and_tables():
                          try:
                          Hero.__table__.drop(engine)
                          exceptsqlalchemy.exc.OperationalError: # table doesn't exist yetpassSQLModel.metadata.create_all(engine)
                          defcreate_heroes():
                          heros= [
                          Hero(name="Deadpond", secret_name="Dive Wilson"),
                          Hero(name="Spider-Boy", secret_name="Pedro Parqueador"),
                          Hero(name="Rusty-Man", secret_name="Tommy Sharp", age=48),
                          Hero(name="Tarantula", secret_name="Natalia Roman-on", age=32),
                          Hero(name="Black Lion", secret_name="Trevor Challa", age=35),
                          Hero(name="Dr. Weird", secret_name="Steve Weird", age=36),
                          Hero(name="Captain North America", secret_name="Esteban Rogelios", age=93),
                          ]
                          withSession(engine) assession:
                          forheroinheros:
                          session.add(hero)
                          session.commit()
                          defselect_heroes():
                          withSession(engine) assession:
                          forheroinsession.exec(select(Hero)):
                          print(hero.id)
                          if__name__=="__main__":
                          whileTrue:
                          try:
                          create_db_and_tables()
                          create_heroes()
                          select_heroes()
                          exceptValueError:
                          raise

                          Cleansed Traceback

                          Traceback (most recent call last):
                          File “/…/sqlmodel_tutorial/minimal_example.py", line 89, in <module>
                          select_heroes()
                          File “/…/sqlmodel_tutorial/minimal_example.py", line 80, in select_heroes
                          for hero in session.exec(select(Hero)):
                          File "/.../lib/python3.8/site-packages/sqlalchemy/engine/result.py", line 381, in iterrows
                          for row in self._fetchiter_impl():
                          File "/.../lib/python3.8/site-packages/sqlalchemy/orm/loading.py", line 147, in chunks
                          fetch = cursor._raw_all_rows()
                          File "/.../lib/python3.8/site-packages/sqlalchemy/engine/result.py", line 392, in _raw_all_rows
                          return [make_row(row) for row in rows]
                          File "/.../lib/python3.8/site-packages/sqlalchemy/engine/result.py", line 392, in <listcomp>
                          return [make_row(row) for row in rows]
                          File "/.../lib/python3.8/site-packages/sqlalchemy/sql/type_api.py", line 1430, in process
                          return process_value(value, dialect)
                          File "/.../lib/python3.8/site-packages/sqlmodel/sql/sqltypes.py", line 61, in process_result_value
                          value = uuid.UUID(value)
                          File “/…/lib/python3.8/uuid.py", line 171, in __init__
                          raise ValueError('badly formed hexadecimal UUID string')
                          ValueError: badly formed hexadecimal UUID string
                          

                          Description

                          Running through the tutorial up until around this point, I tried swapping out the int id key for a UUID key.

                          This works except whenever the uuid.uuid4 default factory creates a UUID with a hexstring that starts with a zero.

                          It appears that here in sqltypes.py that, rather than using UUID().hex, sqltypes.py carries on sqlalchemy's integer stringification apprach, however, doesn't include any padding declaration.

                          IMO there are two options;

                          1. faithfully fix the replication of SQLAlchemy's UUID▶️int▶️str approach with the padding fixed (f"{v.int:032x}")
                          2. switch to using the stdlib UUID.hex implementation for serialisation

                          Personally I'm a fan of the latter so will spin up a PR

                          Operating System

                          macOS

                          Operating System Details

                          No response

                          SQLModel Version

                          0.0.4

                          Python Version

                          3.8.8

                          Additional Context

                          No response

                          Metadata

                          Metadata

                          Assignees

                          No one assigned

                            Labels

                            bugSomething isn't working

                            Type

                            No type

                            Projects

                            No projects

                              Milestone

                              No milestone

                              Relationships

                              None yet

                              Development

                              No branches or pull requests

                              Issue actions

                              , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
                              Skip to content

                              Improper UUID serialisation dropping leading zeros ▶️ "ValueError: badly formed hexadecimal UUID string" #25

                              Description

                              @andrewbolster

                              First Check

                              • I added a very descriptive title to this issue.
                              • I used the GitHub search to find a similar issue and didn't find it.
                              • I searched the SQLModel documentation, with the integrated search.
                              • I already searched in Google "How to X in SQLModel" and didn't find any information.
                              • I already read and followed all the tutorial in the docs and didn't find an answer.
                              • I already checked if it is not related to SQLModel but to Pydantic.
                              • I already checked if it is not related to SQLModel but to SQLAlchemy.

                              Commit to Help

                              • I commit to help with one of those options 👆

                              Example Code

                              importuuidfromtypingimportOptionalimportsqlalchemy.excfromsqlmodelimportSQLModel, Fieldfromsqlmodelimportcreate_engine, Session, selectclassHero(SQLModel, table=True):
                              id: Optional[uuid.UUID] =Field(primary_key=True,
                              default_factory=uuid.uuid4)
                              name: strsecret_name: strage: Optional[int] =Nonedef__str__(self):
                              returnf'{self.name} (AKA {self.secret_name}) [{self.ageifself.ageisnotNoneelse"Unknown"}]'sqlite_file_name="database.db"sqlite_url=f"sqlite:///{sqlite_file_name}"engine=create_engine(sqlite_url, echo=True) # remove echo for proddefcreate_db_and_tables():
                              try:
                              Hero.__table__.drop(engine)
                              exceptsqlalchemy.exc.OperationalError: # table doesn't exist yetpassSQLModel.metadata.create_all(engine)
                              defcreate_heroes():
                              heros= [
                              Hero(name="Deadpond", secret_name="Dive Wilson"),
                              Hero(name="Spider-Boy", secret_name="Pedro Parqueador"),
                              Hero(name="Rusty-Man", secret_name="Tommy Sharp", age=48),
                              Hero(name="Tarantula", secret_name="Natalia Roman-on", age=32),
                              Hero(name="Black Lion", secret_name="Trevor Challa", age=35),
                              Hero(name="Dr. Weird", secret_name="Steve Weird", age=36),
                              Hero(name="Captain North America", secret_name="Esteban Rogelios", age=93),
                              ]
                              withSession(engine) assession:
                              forheroinheros:
                              session.add(hero)
                              session.commit()
                              defselect_heroes():
                              withSession(engine) assession:
                              forheroinsession.exec(select(Hero)):
                              print(hero.id)
                              if__name__=="__main__":
                              whileTrue:
                              try:
                              create_db_and_tables()
                              create_heroes()
                              select_heroes()
                              exceptValueError:
                              raise

                              Cleansed Traceback

                              Traceback (most recent call last):
                              File “/…/sqlmodel_tutorial/minimal_example.py", line 89, in <module>
                              select_heroes()
                              File “/…/sqlmodel_tutorial/minimal_example.py", line 80, in select_heroes
                              for hero in session.exec(select(Hero)):
                              File "/.../lib/python3.8/site-packages/sqlalchemy/engine/result.py", line 381, in iterrows
                              for row in self._fetchiter_impl():
                              File "/.../lib/python3.8/site-packages/sqlalchemy/orm/loading.py", line 147, in chunks
                              fetch = cursor._raw_all_rows()
                              File "/.../lib/python3.8/site-packages/sqlalchemy/engine/result.py", line 392, in _raw_all_rows
                              return [make_row(row) for row in rows]
                              File "/.../lib/python3.8/site-packages/sqlalchemy/engine/result.py", line 392, in <listcomp>
                              return [make_row(row) for row in rows]
                              File "/.../lib/python3.8/site-packages/sqlalchemy/sql/type_api.py", line 1430, in process
                              return process_value(value, dialect)
                              File "/.../lib/python3.8/site-packages/sqlmodel/sql/sqltypes.py", line 61, in process_result_value
                              value = uuid.UUID(value)
                              File “/…/lib/python3.8/uuid.py", line 171, in __init__
                              raise ValueError('badly formed hexadecimal UUID string')
                              ValueError: badly formed hexadecimal UUID string
                              

                              Description

                              Running through the tutorial up until around this point, I tried swapping out the int id key for a UUID key.

                              This works except whenever the uuid.uuid4 default factory creates a UUID with a hexstring that starts with a zero.

                              It appears that here in sqltypes.py that, rather than using UUID().hex, sqltypes.py carries on sqlalchemy's integer stringification apprach, however, doesn't include any padding declaration.

                              IMO there are two options;

                              1. faithfully fix the replication of SQLAlchemy's UUID▶️int▶️str approach with the padding fixed (f"{v.int:032x}")
                              2. switch to using the stdlib UUID.hex implementation for serialisation

                              Personally I'm a fan of the latter so will spin up a PR

                              Operating System

                              macOS

                              Operating System Details

                              No response

                              SQLModel Version

                              0.0.4

                              Python Version

                              3.8.8

                              Additional Context

                              No response

                              Metadata

                              Metadata

                              Assignees

                              No one assigned

                                Labels

                                bugSomething isn't working

                                Type

                                No type

                                Projects

                                No projects

                                  Milestone

                                  No milestone

                                  Relationships

                                  None yet

                                  Development

                                  No branches or pull requests

                                  Issue actions