Releases: piccolo-orm/piccolo
0.61.2
Fixed some edge cases where migrations would fail if a column name clashed with a reserved Postgres keyword (for example order
or select
).
We now have more robust tests for piccolo asgi new
- as part of our CI we actually run the generated ASGI app to make sure it works (thanks to @AliSayyah and @yezz123 for their help with this).
We also improved docstrings across the project.
0.61.1
Nicer ASGI template
When using piccolo asgi new
to generate a web app, it now has a nicer home page template, with improved styles.
Improved schema generation
Fixed a bug with piccolo schema generate
where it would crash if the column type was unrecognised, due to failing to parse the column's default value. Thanks to @gmos for reporting this issue, and figuring out the fix.
Fix Pylance error
Added start_connection_pool
and close_connection_pool
methods to the base Engine
class (courtesy @gmos).
0.61.0
The save
method now supports a columns
argument, so when updating a row you can specify which values to sync back. For example:
band = await Band.objects().get(Band.name == "Pythonistas")
band.name = "Super Pythonistas"
await band.save([Band.name])
# Alternatively, strings are also supported:
await band.save(['name'])
Thanks to @trondhindenes for suggesting this feature.
0.60.2
Fixed a bug with asyncio.gather
not working with some query types. It was due to them being dataclasses, and they couldn't be hashed properly. Thanks to @brnosouza for reporting this issue.
0.60.1
0.60.0
Secret columns
All column types can now be secret, rather than being limited to the Secret
column type which is a Varchar
under the hood (courtesy @sinisaos).
class Manager(Table):
name = Varchar()
net_worth = Integer(secret=True)
The reason this is useful is you can do queries such as:
>>> Manager.select(exclude_secrets=True).run_sync()
[{'id': 1, 'name': 'Guido'}]
In the Piccolo API project we have PiccoloCRUD
which is an incredibly powerful way of building an API with very little code. PiccoloCRUD
has an exclude_secrets
option which lets you safely expose your data without leaking sensitive information.
Pydantic improvements
max_recursion_depth
create_pydantic_model
now has a max_recursion_depth
argument, which is useful when using nested=True
on large database schemas.
>>> create_pydantic_model(MyTable, nested=True, max_recursion_depth=3)
Nested tuple
You can now pass a tuple of columns as the argument to nested
:
>>> create_pydantic_model(Band, nested=(Band.manager,))
This gives you more control than just using nested=True
.
include_columns / exclude_columns
You can now include / exclude columns from related tables. For example:
>>> create_pydantic_model(Band, nested=(Band.manager,), exclude_columns=(Band.manager.country))
Similarly:
>>> create_pydantic_model(Band, nested=(Band.manager,), include_columns=(Band.name, Band.manager.name))
0.59.0
- When using
piccolo asgi new
to generate a FastAPI app, the generated code is now cleaner. It also contains aconftest.py
file, which encourages people to usepiccolo tester run
rather than usingpytest
directly. - Tidied up docs, and added logo.
- Clarified the use of the
PICCOLO_CONF
environment variable in the docs (courtesy @theelderbeever). create_pydantic_model
now accepts aninclude_columns
argument, in case you only want a few columns in your model, it's faster than usingexclude_columns
(courtesy @sinisaos).- Updated linters, and fixed new errors.
0.58.0
Improved Pydantic docs
The Pydantic docs used to be in the Piccolo API repo, but have been moved over to this repo. We took this opportunity to improve them significantly with additional examples. Courtesy @sinisaos.
Internal code refactoring
Some of the code has been optimised and cleaned up. Courtesy @yezz123.
Schema generation for recursive foreign keys
When using piccolo schema generate
, it would get stuck in a loop if a table had a foreign key column which referenced itself. Thanks to @knguyen5 for reporting this issue, and @wmshort for implementing the fix. The output will now look like:
class Employee(Table):
name = Varchar()
manager = ForeignKey("self")
Fixing a bug with Alter.add_column
When using the Alter.add_column
API directly (not via migrations), it would fail with foreign key columns. For example:
SomeTable.alter().add_column(
name="my_fk_column",
column=ForeignKey(SomeOtherTable)
).run_sync()
This has now been fixed. Thanks to @wmshort for discovering this issue.
create_pydantic_model improvements
Additional fields can now be added to the Pydantic schema. This is useful when using Pydantic's JSON schema functionality:
my_model = create_pydantic_model(Band, my_extra_field="Hello")
>>> my_model.schema()
{..., "my_extra_field": "Hello"}
This feature was added to support new features in Piccolo Admin.
Fixing a bug with import clashes in migrations
In certain situations it was possible to create a migration file with clashing imports. For example:
from uuid import UUID
from piccolo.columns.column_types import UUID
Piccolo now tries to detect these clashes, and prevent them. If they can't be prevented automatically, a warning is shown to the user. Courtesy @0scarB.
0.57.0
Added Python 3.10 support (courtesy @kennethcheo).
0.56.0
Fixed schema generation bug
When using piccolo schema generate
to auto generate Piccolo Table
classes from an existing database, it would fail in this situation:
- A table has a column with an index.
- The column name clashed with a Postgres type.
For example, we couldn't auto generate this Table
class:
class MyTable(Table):
time = Timestamp(index=True)
This is because time
is a builtin Postgres type, and the CREATE INDEX
statement being inspected in the database wrapped the column name in quotes, which broke our regex.
Thanks to @knguyen5 for fixing this.
Improved testing docs
A convenience method called get_table_classes
was added to Finder
.
Finder
is the main class in Piccolo for dynamically importing projects / apps / tables / migrations etc.
get_table_classes
lets us easily get the Table
classes for a project. This makes writing unit tests easier, when we need to setup a schema.
from unittest import TestCase
from piccolo.table import create_tables, drop_tables
from piccolo.conf.apps import Finder
TABLES = Finder().get_table_classes()
class TestApp(TestCase):
def setUp(self):
create_tables(*TABLES)
def tearDown(self):
drop_tables(*TABLES)
def test_app(self):
# Do some testing ...
pass
The docs were updated to reflect this.
When dropping tables in a unit test, remember to use piccolo tester run
, to make sure the test database is used.
get_output_schema
get_output_schema
is the main entrypoint for database reflection in Piccolo. It has been modified to accept an optional Engine
argument, which makes it more flexible.