sqlalchemy-query-helpers 1.0.102__py3-none-any.whl → 1.0.104__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of sqlalchemy-query-helpers might be problematic. Click here for more details.
- sqlalchemy_query_helpers/main.py +44 -30
- {sqlalchemy_query_helpers-1.0.102.dist-info → sqlalchemy_query_helpers-1.0.104.dist-info}/METADATA +3 -2
- sqlalchemy_query_helpers-1.0.104.dist-info/RECORD +7 -0
- {sqlalchemy_query_helpers-1.0.102.dist-info → sqlalchemy_query_helpers-1.0.104.dist-info}/WHEEL +1 -1
- sqlalchemy_query_helpers-1.0.102.dist-info/RECORD +0 -7
- {sqlalchemy_query_helpers-1.0.102.dist-info → sqlalchemy_query_helpers-1.0.104.dist-info/licenses}/LICENSE +0 -0
- {sqlalchemy_query_helpers-1.0.102.dist-info → sqlalchemy_query_helpers-1.0.104.dist-info}/top_level.txt +0 -0
sqlalchemy_query_helpers/main.py
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
from sqlalchemy import create_engine, MetaData, Table, select
|
|
2
2
|
from sqlalchemy.orm import sessionmaker, Query, DeclarativeMeta, session
|
|
3
|
+
from sqlalchemy.orm import declarative_base
|
|
3
4
|
from sqlalchemy.orm.session import Session
|
|
4
5
|
from sqlalchemy.orm.attributes import InstrumentedAttribute
|
|
5
6
|
from sqlalchemy.dialects.mysql import insert
|
|
@@ -16,9 +17,15 @@ class DB:
|
|
|
16
17
|
Session: sessionmaker = None
|
|
17
18
|
session: Session = None
|
|
18
19
|
|
|
19
|
-
def __init__(self, db_name, base: DeclarativeMeta,
|
|
20
|
+
def __init__(self, db_name, base: DeclarativeMeta, db_url: str | None = None, echo=False):
|
|
21
|
+
"""
|
|
22
|
+
:param db_url: URL as "{user}:{password}@{host}" without [schema + netloc],
|
|
23
|
+
that will use as f'mysql+pymysql://{db_url}'.
|
|
24
|
+
It's convenient to store this string as an OS environment variable.
|
|
25
|
+
None - Use OS environment variables: 'DB_USER', 'DB_PASSWORD', 'DB_HOST'.
|
|
26
|
+
"""
|
|
20
27
|
self.base = base
|
|
21
|
-
engine_str = self.make_engine_str(
|
|
28
|
+
engine_str = self.make_engine_str(db_url)
|
|
22
29
|
self.engine = create_engine(f'{engine_str}/{db_name}', echo=echo)
|
|
23
30
|
self.Session = sessionmaker(bind=self.engine)
|
|
24
31
|
# self.session = self.Session()
|
|
@@ -31,12 +38,14 @@ class DB:
|
|
|
31
38
|
self.session.close()
|
|
32
39
|
|
|
33
40
|
@staticmethod
|
|
34
|
-
def make_engine_str(
|
|
41
|
+
def make_engine_str(db_url: str | None) -> str:
|
|
35
42
|
"""
|
|
36
43
|
Create an engine string (schema + netloc), like "mysql+pymysql://USER:PASSWORD@HOST"
|
|
37
|
-
:param
|
|
44
|
+
:param db_url: URL as "{user}:{password}@{host}" that will use as f'mysql+pymysql://{db_url}'.
|
|
45
|
+
It's convenient to store this string as an OS environment variable.
|
|
46
|
+
None - Use OS environment variables: 'DB_USER', 'DB_PASSWORD', 'DB_HOST'.
|
|
38
47
|
"""
|
|
39
|
-
if
|
|
48
|
+
if not db_url:
|
|
40
49
|
import os
|
|
41
50
|
try:
|
|
42
51
|
user = os.environ['DB_USER']
|
|
@@ -44,9 +53,9 @@ class DB:
|
|
|
44
53
|
host = os.environ['DB_HOST']
|
|
45
54
|
except KeyError:
|
|
46
55
|
raise RuntimeError("Set the 'DB_USER', 'DB_PASSWORD', 'DB_HOST' OS env variables")
|
|
56
|
+
engine_str = f'mysql+pymysql://{user}:{password}@{host}'
|
|
47
57
|
else:
|
|
48
|
-
|
|
49
|
-
engine_str = f'mysql+pymysql://{user}:{password}@{host}'
|
|
58
|
+
engine_str = f'mysql+pymysql://{db_url}'
|
|
50
59
|
return engine_str
|
|
51
60
|
|
|
52
61
|
def get_predefined_table(self, table_name: str, base_metadata=None):
|
|
@@ -106,19 +115,21 @@ class DB:
|
|
|
106
115
|
return new_rowid
|
|
107
116
|
|
|
108
117
|
def insert_many(self, t, rows: Union[list, tuple], mfields: Union[list, tuple] = None, do_commit=True):
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
118
|
+
with self.Session() as s:
|
|
119
|
+
for row in rows:
|
|
120
|
+
row = self.__to_dict(row, mfields, use_orm_keys=True)
|
|
121
|
+
m = t(**row)
|
|
122
|
+
s.add(m)
|
|
123
|
+
if do_commit:
|
|
124
|
+
s.commit()
|
|
115
125
|
|
|
116
|
-
def insert_one(self, t, row: Union[list, tuple], mfields: Union[list, tuple] = None, ignore=False):
|
|
126
|
+
def insert_one(self, t, row: Union[dict, list, tuple], mfields: Union[list, tuple] = None, ignore=False):
|
|
117
127
|
q = insert(t).values(self.__to_dict(row, mfields))
|
|
118
128
|
if ignore:
|
|
119
129
|
q = q.prefix_with('IGNORE', dialect='mysql')
|
|
120
|
-
|
|
121
|
-
|
|
130
|
+
with self.Session() as s:
|
|
131
|
+
r = s.execute(q)
|
|
132
|
+
s.commit()
|
|
122
133
|
return r.lastrowid
|
|
123
134
|
|
|
124
135
|
def insert_ignore(self, t, row: Union[dict, list, tuple], mfields: Iterable[InstrumentedAttribute] = None) -> bool:
|
|
@@ -126,18 +137,19 @@ class DB:
|
|
|
126
137
|
return is_inserted
|
|
127
138
|
|
|
128
139
|
def insert_ignore_many(self, t, rows: List[dict], mfields: Iterable[InstrumentedAttribute] = None) -> bool:
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
140
|
+
with self.Session() as s:
|
|
141
|
+
is_inserted = False
|
|
142
|
+
for row in rows:
|
|
143
|
+
row = self.__to_dict(row, mfields, use_orm_keys=True)
|
|
144
|
+
try:
|
|
145
|
+
with s.begin_nested():
|
|
146
|
+
m = t(**row)
|
|
147
|
+
s.add(m)
|
|
148
|
+
is_inserted = True
|
|
149
|
+
except IntegrityError:
|
|
150
|
+
# print(f'already in DB: {row}')
|
|
151
|
+
pass
|
|
152
|
+
s.commit()
|
|
141
153
|
return is_inserted
|
|
142
154
|
|
|
143
155
|
def insert_ignore_core(self, t, row: Union[dict, list, tuple], mfields: Union[list, tuple] = None) -> None:
|
|
@@ -170,7 +182,8 @@ class DB:
|
|
|
170
182
|
def update(self, t, row: Union[dict, list, tuple], cause_keys: Union[list, tuple], mfields: Union[list, tuple] = None) -> (bool, bool):
|
|
171
183
|
row = self.__to_dict(row, mfields)
|
|
172
184
|
in_keys, not_in_keys = self.__check_modelkeys(row, cause_keys) # get_check_args(row, keys)
|
|
173
|
-
|
|
185
|
+
with self.Session() as s:
|
|
186
|
+
rows_updates = s.query(t).filter_by(**in_keys).update(not_in_keys)
|
|
174
187
|
# q = update(t).values(**not_in_keys).where(**in_keys)
|
|
175
188
|
# rows_updates = self.db.session.execute(q)
|
|
176
189
|
# self.db.session.commit()
|
|
@@ -184,7 +197,8 @@ class DB:
|
|
|
184
197
|
cause_dict, to_insert_dict = self.__check_modelkeys(row, cause_dict)
|
|
185
198
|
# r = Query(t, session=self.session).filter_by(**cause_dict).first()
|
|
186
199
|
q = select(t).where(**cause_dict).limit(1)
|
|
187
|
-
|
|
200
|
+
with self.Session() as s:
|
|
201
|
+
r = s.execute(q).first()
|
|
188
202
|
if r:
|
|
189
203
|
for k, v in to_insert_dict.items():
|
|
190
204
|
if vars(r)[k] != v:
|
{sqlalchemy_query_helpers-1.0.102.dist-info → sqlalchemy_query_helpers-1.0.104.dist-info}/METADATA
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
2
|
Name: sqlalchemy-query-helpers
|
|
3
|
-
Version: 1.0.
|
|
3
|
+
Version: 1.0.104
|
|
4
4
|
Summary: Some helpers for SQLAlchemy
|
|
5
5
|
Author-email: vladiscripts <blagopoluchie12@gmail.com>
|
|
6
6
|
Project-URL: Homepage, https://github.com/vladiscripts/sqlalchemy-query-helpers
|
|
@@ -12,6 +12,7 @@ Requires-Python: >=3.10
|
|
|
12
12
|
Description-Content-Type: text/markdown
|
|
13
13
|
License-File: LICENSE
|
|
14
14
|
Requires-Dist: sqlalchemy
|
|
15
|
+
Dynamic: license-file
|
|
15
16
|
|
|
16
17
|
Пакет содержит хелперы для пакета SQLAlchmy - методов `insert`, `upsert`, `update` и другое.
|
|
17
18
|
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
sqlalchemy_query_helpers/__init__.py,sha256=xxmsXX2HKm1K8Ay9sy_tXGkPDWz3NXJI0s4xiwPckr0,39
|
|
2
|
+
sqlalchemy_query_helpers/main.py,sha256=4bEa1vnm7iUdykmgJi9b8D5SWNog93i6OrnUHgFhe30,14006
|
|
3
|
+
sqlalchemy_query_helpers-1.0.104.dist-info/licenses/LICENSE,sha256=XUL1pa84eZAnKR9S2WnYrv2M523Oysejy3KPlVSyCks,1069
|
|
4
|
+
sqlalchemy_query_helpers-1.0.104.dist-info/METADATA,sha256=X_47uSGf-vYqFXZIHRlNdx9R6-GRaWWSDOo2XBJli-M,2621
|
|
5
|
+
sqlalchemy_query_helpers-1.0.104.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
6
|
+
sqlalchemy_query_helpers-1.0.104.dist-info/top_level.txt,sha256=3CUM4jiTua2frHF1satgUAYlW0QfDsvdkxO_6Fj_0zY,25
|
|
7
|
+
sqlalchemy_query_helpers-1.0.104.dist-info/RECORD,,
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
sqlalchemy_query_helpers/__init__.py,sha256=xxmsXX2HKm1K8Ay9sy_tXGkPDWz3NXJI0s4xiwPckr0,39
|
|
2
|
-
sqlalchemy_query_helpers/main.py,sha256=P8TLCQVT8L0l9iwmWnSxFZfpX0HaLuXuAi98zJPdCFQ,13282
|
|
3
|
-
sqlalchemy_query_helpers-1.0.102.dist-info/LICENSE,sha256=XUL1pa84eZAnKR9S2WnYrv2M523Oysejy3KPlVSyCks,1069
|
|
4
|
-
sqlalchemy_query_helpers-1.0.102.dist-info/METADATA,sha256=YOWWGLBJlFw3iUu5UCs59aNc7xuPhfTo2ahP1fO5ZfE,2599
|
|
5
|
-
sqlalchemy_query_helpers-1.0.102.dist-info/WHEEL,sha256=GV9aMThwP_4oNCtvEC2ec3qUYutgWeAzklro_0m4WJQ,91
|
|
6
|
-
sqlalchemy_query_helpers-1.0.102.dist-info/top_level.txt,sha256=3CUM4jiTua2frHF1satgUAYlW0QfDsvdkxO_6Fj_0zY,25
|
|
7
|
-
sqlalchemy_query_helpers-1.0.102.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|