-1

I use peewee as package providing an ORM functionality. I created models related one another by one-to-one relationship. The following code is my models.

def __account_model(self) -> Type[Model]:
    db = self.__sql_db

    class AccountModel(Model):
        password = CharField(max_length=255)
        is_successful_authorized = BooleanField(null=True, default=None)

        class Meta:
            database = db

    return AccountModel

def linkedin(self) -> Type[Model]:
    model = self.__account_model

    class Linkedin(model):
        email = ForeignKeyField(self.email, backref='linkedin')
        cookies = TextField(null=True, default=None)

    return Linkedin

def email(self) -> Type[Model]:
    model = self.__account_model

    class Email(model):
        login = CharField(max_length=255)

    return Email

Here I try to create an instance of the LinkedIn's model.

password, email_login, email_password, cookies = account.values()
email=controller.email.create(password=email_password,login=email_login)
model.create(password=password, email=email, cookies=cookies)

But when I run my code, I've got this error:

Traceback (most recent call last):
  File "/Users/blnkoff/PycharmProjects/gitcoin-passport-bot/accounts/build_database.py", line 17, in <module>
    db.build([ModelType.LINKEDIN, ModelType.FACEBOOK, ModelType.GOOGLE,
  File "/Users/blnkoff/PycharmProjects/gitcoin-passport-bot/accounts/database.py", line 66, in build
    model.create(password=password, email=email, cookies=cookies)
  File "/Users/blnkoff/PycharmProjects/gitcoin-passport-bot/venv/lib/python3.11/site-packages/peewee.py", line 6577, in create
    inst.save(force_insert=True)
  File "/Users/blnkoff/PycharmProjects/gitcoin-passport-bot/venv/lib/python3.11/site-packages/peewee.py", line 6787, in save
    pk = self.insert(**field_dict).execute()
         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/blnkoff/PycharmProjects/gitcoin-passport-bot/venv/lib/python3.11/site-packages/peewee.py", line 1966, in inner
    return method(self, database, *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/blnkoff/PycharmProjects/gitcoin-passport-bot/venv/lib/python3.11/site-packages/peewee.py", line 2037, in execute
    return self._execute(database)
           ^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/blnkoff/PycharmProjects/gitcoin-passport-bot/venv/lib/python3.11/site-packages/peewee.py", line 2842, in _execute
    return super(Insert, self)._execute(database)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/blnkoff/PycharmProjects/gitcoin-passport-bot/venv/lib/python3.11/site-packages/peewee.py", line 2555, in _execute
    cursor = database.execute(self)
             ^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/blnkoff/PycharmProjects/gitcoin-passport-bot/venv/lib/python3.11/site-packages/peewee.py", line 3253, in execute
    sql, params = ctx.sql(query).query()
                  ^^^^^^^^^^^^^^
  File "/Users/blnkoff/PycharmProjects/gitcoin-passport-bot/venv/lib/python3.11/site-packages/peewee.py", line 628, in sql
    return obj.__sql__(self)
           ^^^^^^^^^^^^^^^^^
  File "/Users/blnkoff/PycharmProjects/gitcoin-passport-bot/venv/lib/python3.11/site-packages/peewee.py", line 2819, in __sql__
    self._simple_insert(ctx)
  File "/Users/blnkoff/PycharmProjects/gitcoin-passport-bot/venv/lib/python3.11/site-packages/peewee.py", line 2669, in _simple_insert
    return self._generate_insert((self._insert,), ctx)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/blnkoff/PycharmProjects/gitcoin-passport-bot/venv/lib/python3.11/site-packages/peewee.py", line 2791, in _generate_insert
    return ctx.sql(CommaNodeList(all_values))
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/blnkoff/PycharmProjects/gitcoin-passport-bot/venv/lib/python3.11/site-packages/peewee.py", line 628, in sql
    return obj.__sql__(self)
           ^^^^^^^^^^^^^^^^^
  File "/Users/blnkoff/PycharmProjects/gitcoin-passport-bot/venv/lib/python3.11/site-packages/peewee.py", line 1832, in __sql__
    ctx.sql(self.nodes[n_nodes - 1])
  File "/Users/blnkoff/PycharmProjects/gitcoin-passport-bot/venv/lib/python3.11/site-packages/peewee.py", line 628, in sql
    return obj.__sql__(self)
           ^^^^^^^^^^^^^^^^^
  File "/Users/blnkoff/PycharmProjects/gitcoin-passport-bot/venv/lib/python3.11/site-packages/peewee.py", line 1830, in __sql__
    ctx.sql(self.nodes[i])
  File "/Users/blnkoff/PycharmProjects/gitcoin-passport-bot/venv/lib/python3.11/site-packages/peewee.py", line 628, in sql
    return obj.__sql__(self)
           ^^^^^^^^^^^^^^^^^
  File "/Users/blnkoff/PycharmProjects/gitcoin-passport-bot/venv/lib/python3.11/site-packages/peewee.py", line 1430, in __sql__
    return ctx.value(self.value, self.converter)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/blnkoff/PycharmProjects/gitcoin-passport-bot/venv/lib/python3.11/site-packages/peewee.py", line 640, in value
    value = converter(value)
            ^^^^^^^^^^^^^^^^
  File "/Users/blnkoff/PycharmProjects/gitcoin-passport-bot/venv/lib/python3.11/site-packages/peewee.py", line 5417, in db_value
    return self.rel_field.db_value(value)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/blnkoff/PycharmProjects/gitcoin-passport-bot/venv/lib/python3.11/site-packages/peewee.py", line 4744, in db_value
    return value if value is None else self.adapt(value)
                                       ^^^^^^^^^^^^^^^^^
  File "/Users/blnkoff/PycharmProjects/gitcoin-passport-bot/venv/lib/python3.11/site-packages/peewee.py", line 4804, in adapt
    return int(value)
           ^^^^^^^^^^
TypeError: int() argument must be a string, a bytes-like object or a real number, not 'Email'

But I didn't pass int arguments, as you can see in the code above. I tried to check the table's content, but the instance of email was created successfully. enter image description here

What could this error be related to?

blnk.off
  • 44
  • 5
  • Why don't you create a minimal example that doesn't use all these weird unnecessary closures, ambiguously-named variables, etc. This is not at all the idiomatic way to write peewee code and is frankly garbage. Start with the basics. – coleifer Aug 12 '23 at 21:17

2 Answers2

0

Hopefully this helps. You don't seem to understand how foreign-keys work.

from peewee import *

db = SqliteDatabase(':memory:')

class User(db.Model):
    email = TextField()

class Something(db.Model):
    user = ForeignKeyField(User)
    data = TextField()

db.create_tables([User, Something])

u1, u2 = User.create(email='u1'), User.create(email='u2')

Something.create(user=u1, data='u1-s1')
Something.create(user=u1, data='u1-s2')
Something.create(user=u2, data='u2-s1')

for s in Something.select(Something, User).join(User):
    print(s.user.email, s.data)

This prints:

u1 u1-s1
u1 u1-s2
u2 u2-s1

As you can see, a "Something" has a reference to a "User". A "User" can have any number of somethings -- 0, 1 or 1,000,000.

If you want a 1-to-1 relationship, then you simply define the user foreign-key as "unique":

class Something(db.Model):
    user = ForeignKeyField(User, unique=True)
    data = TextField()

Now a user can only have 0 or 1 "Something".

coleifer
  • 24,887
  • 6
  • 60
  • 75
-1

I've realized how to resolve this issue. It's really weird, but when I tried to pass email.id, it had worked.

model.create(password=password, email=email.id, cookies=cookies)

It's so freaky, because in the official documentation id property didn't pass directly.

enter image description here

Are there people who understand why that work that way? What ORM-based packages do you use, when application don't relate to backend and Django?

blnk.off
  • 44
  • 5
  • You don't seem to understand that a foreign-key is just a reference to a unique identifier in a separate table, and furthermore that the foreign-key only lives on one side of that relationship. – coleifer Aug 12 '23 at 21:19
  • I understand it. I can't understand why in the official documentation as argument you can pass instance of model and I can't do the same – blnk.off Aug 12 '23 at 22:01
  • I show another example right here: https://stackoverflow.com/a/76891175/254346 - as I said, I don't think you understand at all and your code is unnecessarily complicated and unreadable. – coleifer Aug 13 '23 at 14:06