modified data moddel, to support non static use of the model
This commit is contained in:
parent
4719f46c49
commit
71e79faac4
@ -1,4 +1,4 @@
|
|||||||
from typing import List, Union, Type
|
from typing import List, Union, Type, Optional
|
||||||
from peewee import (
|
from peewee import (
|
||||||
SqliteDatabase,
|
SqliteDatabase,
|
||||||
PostgresqlDatabase,
|
PostgresqlDatabase,
|
||||||
@ -11,6 +11,18 @@ from peewee import (
|
|||||||
TextField
|
TextField
|
||||||
)
|
)
|
||||||
|
|
||||||
|
"""
|
||||||
|
**IMPORTANT**:
|
||||||
|
|
||||||
|
never delete, modify the datatype or add constrains to ANY existing collumns,
|
||||||
|
between the versions, that gets pushed out to the users.
|
||||||
|
Else my function can't update legacy databases, to new databases,
|
||||||
|
while keeping the data of the old ones.
|
||||||
|
|
||||||
|
EVEN if that means to for example keep decimal values stored in strings.
|
||||||
|
(not in my codebase though.)
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
||||||
class BaseModel(Model):
|
class BaseModel(Model):
|
||||||
class Meta:
|
class Meta:
|
||||||
@ -24,7 +36,6 @@ class BaseModel(Model):
|
|||||||
def use(self, database: Union[SqliteDatabase, PostgresqlDatabase, MySQLDatabase]) -> Model:
|
def use(self, database: Union[SqliteDatabase, PostgresqlDatabase, MySQLDatabase]) -> Model:
|
||||||
self._meta.database = database
|
self._meta.database = database
|
||||||
return self
|
return self
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class Album(BaseModel):
|
class Album(BaseModel):
|
||||||
@ -120,25 +131,35 @@ class AlbumArtist(BaseModel):
|
|||||||
artist: ForeignKeyField = ForeignKeyField(Artist, backref='album_artists')
|
artist: ForeignKeyField = ForeignKeyField(Artist, backref='album_artists')
|
||||||
|
|
||||||
|
|
||||||
|
ALL_MODELS = [
|
||||||
|
Song,
|
||||||
|
Album,
|
||||||
|
Artist,
|
||||||
|
Source,
|
||||||
|
Lyrics,
|
||||||
|
AlbumArtist,
|
||||||
|
Target,
|
||||||
|
SongArtist
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
database_1 = SqliteDatabase(":memory:")
|
if __name__ == "__main__":
|
||||||
database_1.create_tables([Song.Use(database_1)])
|
database_1 = SqliteDatabase(":memory:")
|
||||||
database_2 = SqliteDatabase(":memory:")
|
database_1.create_tables([Song.Use(database_1)])
|
||||||
database_2.create_tables([Song.Use(database_2)])
|
database_2 = SqliteDatabase(":memory:")
|
||||||
|
database_2.create_tables([Song.Use(database_2)])
|
||||||
|
|
||||||
# creating songs, adding it to db_2 if i is even, else to db_1
|
# creating songs, adding it to db_2 if i is even, else to db_1
|
||||||
for i in range(100):
|
for i in range(100):
|
||||||
song = Song(name=str(i) + "hs")
|
song = Song(name=str(i) + "hs")
|
||||||
|
|
||||||
db_to_use = database_2 if i % 2 == 0 else database_1
|
db_to_use = database_2 if i % 2 == 0 else database_1
|
||||||
song.use(db_to_use).save()
|
song.use(db_to_use).save()
|
||||||
|
|
||||||
print("database 1")
|
print("database 1")
|
||||||
for song in Song.Use(database_1).select():
|
for song in Song.Use(database_1).select():
|
||||||
print(song.name)
|
print(song.name)
|
||||||
|
|
||||||
print("database 2")
|
|
||||||
for song in Song.Use(database_1).select():
|
|
||||||
print(song.name)
|
|
||||||
|
|
||||||
|
print("database 2")
|
||||||
|
for song in Song.Use(database_1).select():
|
||||||
|
print(song.name)
|
||||||
|
@ -75,5 +75,22 @@ class Database:
|
|||||||
create tables if they don't exist.
|
create tables if they don't exist.
|
||||||
"""
|
"""
|
||||||
self.database = self.create_database()
|
self.database = self.create_database()
|
||||||
|
|
||||||
self.database.connect()
|
self.database.connect()
|
||||||
|
|
||||||
|
self.database.create_tables(data_models.ALL_MODELS, safe=True)
|
||||||
|
|
||||||
|
"""
|
||||||
|
upgrade old databases.
|
||||||
|
If a collumn has been added in a new version this adds it to old Tables,
|
||||||
|
without deleting the data in legacy databases
|
||||||
|
"""
|
||||||
|
for model in data_models.ALL_MODELS:
|
||||||
|
for field_name, field_obj in model._meta.fields.items():
|
||||||
|
# check if the field exists in the database
|
||||||
|
if not self.database.table_column_exists(model._meta.db_table, field_name):
|
||||||
|
# add the missing column to the table
|
||||||
|
self.database.add_column(model._meta.db_table, field_name, field_obj)
|
||||||
|
|
||||||
|
|
||||||
|
def __del__(self):
|
||||||
|
self.database.close()
|
||||||
|
Loading…
Reference in New Issue
Block a user