feat: new orm module

This commit is contained in:
EstrellaXD
2023-06-14 20:39:19 +08:00
parent 76112ad3e1
commit 6bd6306dc6
8 changed files with 248 additions and 218 deletions

View File

@@ -1,12 +1,11 @@
import logging
from .connector import Connector
logger = logging.getLogger(__name__)
class Update:
def __init__(self, db: Connector, table_name: str, data: dict):
self.db = db
def __init__(self, connector, table_name: str, data: dict):
self._connector = connector
self._table_name = table_name
self._columns = data.items()
@@ -18,10 +17,10 @@ class Update:
]
)
create_table_sql = f"CREATE TABLE IF NOT EXISTS {self._table_name} ({columns});"
self.db.execute(create_table_sql)
self.db.execute(f"PRAGMA table_info({self._table_name})")
self._connector.execute(create_table_sql)
self._connector.execute(f"PRAGMA table_info({self._table_name})")
existing_columns = {
column_info[1]: column_info for column_info in self.db.fetchall()
column_info[1]: column_info for column_info in self._connector.fetchall()
}
for key, value in self._columns:
if key not in existing_columns:
@@ -29,26 +28,49 @@ class Update:
if value is None:
value = "NULL"
add_column_sql = f"ALTER TABLE {self._table_name} ADD COLUMN {key} {insert_column} DEFAULT {value};"
self.db.execute(add_column_sql)
self._connector.execute(add_column_sql)
logger.debug(f"Create / Update table {self._table_name}.")
def one(self, data: dict) -> bool:
_id = data.pop("id")
_id = data["id"]
set_sql = ", ".join([f"{key} = :{key}" for key in data.keys()])
self.db.execute(
self._connector.execute(
f"""
UPDATE {self._table_name}
SET {set_sql}
WHERE id = {_id}
WHERE id = :id
""",
data,
)
logger.debug(f"Update {_id} in {self._table_name}.")
return True
def list(self, data: list[dict]):
for item in data:
self.one(item)
def many(self, data: list[dict]) -> bool:
columns = ", ".join(data[0].keys())
self._connector.executemany(
f"""
UPDATE {self._table_name}
SET {columns}
WHERE id = :id
""",
data,
)
logger.debug(f"Update {self._table_name}.")
return True
def value(self, location: dict, set_value: dict) -> bool:
set_sql = ", ".join([f"{key} = :{key}" for key in set_value.keys()])
params = {**location, **set_value}
self._connector.execute(
f"""
UPDATE {self._table_name}
SET {set_sql}
WHERE {location["key"]} = :{location["key"]}
""",
params,
)
logger.debug(f"Update {self._table_name}.")
return True
@staticmethod
def __python_to_sqlite_type(value) -> str:
@@ -65,4 +87,4 @@ class Update:
elif value is None:
return "TEXT"
else:
raise ValueError(f"Unsupported data type: {type(value)}")
raise ValueError(f"Unsupported data type: {type(value)}")