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.

@@ -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, use_os_env=True, echo=False):
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(use_os_env)
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(use_os_env) -> 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 use_os_env: Use OS envs 'DB_USER', 'DB_PASSWORD', 'DB_HOST', instead the `cfg.py` file
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 use_os_env:
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
- from cfg import user, password, host
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
- for row in rows:
110
- row = self.__to_dict(row, mfields, use_orm_keys=True)
111
- m = t(**row)
112
- self.session.add(m)
113
- if do_commit:
114
- self.session.commit()
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
- r = self.session.execute(q)
121
- self.session.commit()
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
- is_inserted = False
130
- for row in rows:
131
- row = self.__to_dict(row, mfields, use_orm_keys=True)
132
- try:
133
- with self.session.begin_nested():
134
- m = t(**row)
135
- self.session.add(m)
136
- is_inserted = True
137
- except IntegrityError:
138
- # print(f'already in DB: {row}')
139
- pass
140
- self.session.commit()
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
- rows_updates = Query(t, session=self.session).filter_by(**in_keys).update(not_in_keys)
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
- r = self.session.execute(q).first()
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:
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.4
2
2
  Name: sqlalchemy-query-helpers
3
- Version: 1.0.102
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,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (75.1.0)
2
+ Generator: setuptools (80.9.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
@@ -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,,