fastapi / sqlmodel

SQL databases in Python, designed for simplicity, compatibility, and robustness.
https://sqlmodel.tiangolo.com/
MIT License
14.51k stars 660 forks source link

How to deal with column type needed situation? #95

Open Ma233 opened 3 years ago

Ma233 commented 3 years ago

First Check

Commit to Help

Example Code

from sqlmodel import SQLModel, UniqueConstraint, select

class BookCollection(SQLModel, table=True):
    user_nid: int
    book_nid: int

UniqueConstraint(
    BookCollection.user_nid,  # Argument of type "int" cannot be assigned to parameter "columns" of type "str | Column[Any]" in function "__init__"
    BookCollection.book_nid,  # Argument of type "int" cannot be assigned to parameter "columns" of type "str | Column[Any]" in function "__init__"
    name="uidx_book_collection_user_nid_book_nid",
)

# Cannot access member "not_in" for type "int"
select(BookCollection).where(BookCollection.book_nid.not_in([1, 2, 3]))

Description

Some APIs of sqlalchemy may still need a column type. Without that, a type checker will complain. Currently, I'm using type: ignore to skip those.

Operating System

Linux, macOS

Operating System Details

No response

SQLModel Version

0.0.4

Python Version

3.8.6

Additional Context

No response

ljluestc commented 1 year ago

from sqlmodel import SQLModel, select, Column from sqlalchemy import UniqueConstraint from typing import List

class BookCollection(SQLModel, table=True): user_nid: int book_nid: int

Define the table's UniqueConstraint using SQLAlchemy's Column objects

uidx_book_collection = UniqueConstraint( Column("user_nid", Integer), # Specify the column type Column("book_nid", Integer), # Specify the column type name="uidx_book_collection_user_nid_book_nid" )

Use a list to specify the column names for the "in_" condition

book_nids: List[int] = [1, 2, 3] query = select(BookCollection).where(BookCollection.booknid.in(book_nids))

print(uidx_book_collection) print(query)