|
17 | 17 |
|
18 | 18 | from casbin import persist
|
19 | 19 | from casbin.persist.adapters.asyncio import AsyncAdapter
|
20 |
| -from sqlalchemy import Column, Integer, String, delete |
| 20 | +from sqlalchemy import Column, Integer, String, delete, insert |
21 | 21 | from sqlalchemy import or_
|
22 | 22 | from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession
|
23 | 23 | from sqlalchemy.future import select
|
@@ -183,14 +183,20 @@ async def add_policy(self, sec, ptype, rule):
|
183 | 183 |
|
184 | 184 | async def add_policies(self, sec, ptype, rules):
|
185 | 185 | """adds a policy rules to the storage."""
|
186 |
| - if self._external_session is not None: |
187 |
| - # Use external session to add all rules in the same transaction |
188 |
| - for rule in rules: |
189 |
| - await self._save_policy_line(ptype, rule, self._external_session) |
190 |
| - else: |
191 |
| - # Use individual sessions for each rule (original behavior) |
192 |
| - for rule in rules: |
193 |
| - await self._save_policy_line(ptype, rule) |
| 186 | + if not rules: |
| 187 | + return |
| 188 | + |
| 189 | + # Build rows for executemany bulk insert |
| 190 | + rows = [] |
| 191 | + for rule in rules: |
| 192 | + row = {"ptype": ptype} |
| 193 | + for i, v in enumerate(rule): |
| 194 | + row[f"v{i}"] = v |
| 195 | + rows.append(row) |
| 196 | + |
| 197 | + async with self._session_scope() as session: |
| 198 | + stmt = insert(self._db_class) |
| 199 | + await session.execute(stmt, rows) |
194 | 200 |
|
195 | 201 | async def remove_policy(self, sec, ptype, rule):
|
196 | 202 | """removes a policy rule from the storage."""
|
|
0 commit comments