|
19 | 19 | MetaData, |
20 | 20 | Table, |
21 | 21 | UniqueConstraint, |
| 22 | + conv, |
22 | 23 | ) |
23 | 24 | from sqlalchemy.sql.expression import text |
24 | 25 | from sqlalchemy.sql.sqltypes import NullType |
@@ -2246,6 +2247,123 @@ class Simple(Base): |
2246 | 2247 | """, |
2247 | 2248 | ) |
2248 | 2249 |
|
| 2250 | + def test_constraints_with_default_names(self, generator: CodeGenerator) -> None: |
| 2251 | + generator.metadata.naming_convention = { |
| 2252 | + "uq": "UNIQUE_%(table_name)s_%(column_0_N_name)s", |
| 2253 | + "ck": "CHECK_%(table_name)s", |
| 2254 | + "fk": "FOREIGN_%(table_name)s_%(column_0_key)s" |
| 2255 | + "_%(referred_table_name)s_%(referred_column_0_label)s", |
| 2256 | + "pk": "PRIMARY_%(table_name)s_%(column_0N_name)s", |
| 2257 | + } |
| 2258 | + |
| 2259 | + Table( |
| 2260 | + "items", |
| 2261 | + generator.metadata, |
| 2262 | + Column("id", INTEGER), |
| 2263 | + Column("name", VARCHAR), |
| 2264 | + Column("container_id", INTEGER), |
| 2265 | + PrimaryKeyConstraint("id", "name", name="PRIMARY_items_idname"), |
| 2266 | + UniqueConstraint("id", name="UNIQUE_items_id"), |
| 2267 | + ForeignKeyConstraint( |
| 2268 | + ["container_id"], |
| 2269 | + ["containers.id"], |
| 2270 | + name="FOREIGN_items_container_id_containers_id", |
| 2271 | + ), |
| 2272 | + ) |
| 2273 | + Table( |
| 2274 | + "containers", |
| 2275 | + generator.metadata, |
| 2276 | + Column("id", INTEGER), |
| 2277 | + Column("name", VARCHAR), |
| 2278 | + PrimaryKeyConstraint("id", name="PRIMARY_containers_id"), |
| 2279 | + UniqueConstraint("id", "name", name="UNIQUE_containers_id_name"), |
| 2280 | + CheckConstraint("id > 0", name="CHECK_containers"), |
| 2281 | + ) |
| 2282 | + |
| 2283 | + validate_code( |
| 2284 | + generator.generate(), |
| 2285 | + """\ |
| 2286 | + from sqlalchemy import CheckConstraint, Column, ForeignKey, \ |
| 2287 | +Integer, String, UniqueConstraint |
| 2288 | + from sqlalchemy.orm import declarative_base, relationship |
| 2289 | +
|
| 2290 | + metadata = MetaData.naming_convention = { |
| 2291 | + "uq": "UNIQUE_%(table_name)s_%(column_0_N_name)s", |
| 2292 | + "ck": "CHECK_%(table_name)s", |
| 2293 | + "fk": "FOREIGN_%(table_name)s_%(column_0_key)s_\ |
| 2294 | +%(referred_table_name)s_%(referred_column_0_label)s", |
| 2295 | + "pk": "PRIMARY_%(table_name)s_%(column_0N_name)s", |
| 2296 | + } |
| 2297 | +
|
| 2298 | + Base = declarative_base(metadata=metadata) |
| 2299 | +
|
| 2300 | +
|
| 2301 | + class Containers(Base): |
| 2302 | + __tablename__ = 'containers' |
| 2303 | + __table_args__ = ( |
| 2304 | + CheckConstraint('id > 0'), |
| 2305 | + UniqueConstraint('id', 'name') |
| 2306 | + ) |
| 2307 | +
|
| 2308 | + id = Column(Integer, primary_key=True) |
| 2309 | + name = Column(String) |
| 2310 | +
|
| 2311 | + items = relationship('Items', back_populates='container') |
| 2312 | +
|
| 2313 | +
|
| 2314 | + class Items(Base): |
| 2315 | + __tablename__ = 'items' |
| 2316 | +
|
| 2317 | + id = Column(Integer, primary_key=True, nullable=False, unique=True) |
| 2318 | + name = Column(String, primary_key=True, nullable=False) |
| 2319 | + container_id = Column(ForeignKey('containers.id')) |
| 2320 | +
|
| 2321 | + container = relationship('Containers', back_populates='items') |
| 2322 | + """, |
| 2323 | + ) |
| 2324 | + |
| 2325 | + def test_constraint_name_token(self, generator: CodeGenerator) -> None: |
| 2326 | + generator.metadata.naming_convention = { |
| 2327 | + "ck": "ck_%(table_name)s_%(constraint_name)s", |
| 2328 | + "pk": "pk_%(table_name)s", |
| 2329 | + } |
| 2330 | + |
| 2331 | + Table( |
| 2332 | + "simple", |
| 2333 | + generator.metadata, |
| 2334 | + Column("id", INTEGER), |
| 2335 | + Column("number", INTEGER), |
| 2336 | + PrimaryKeyConstraint("id", name="pk_simple"), |
| 2337 | + CheckConstraint("id > 0", name=conv("ck_simple_idcheck")), |
| 2338 | + CheckConstraint("number > 0", name=conv("non_default_name")), |
| 2339 | + ) |
| 2340 | + |
| 2341 | + validate_code( |
| 2342 | + generator.generate(), |
| 2343 | + """\ |
| 2344 | + from sqlalchemy import CheckConstraint, Column, Integer |
| 2345 | + from sqlalchemy.orm import declarative_base |
| 2346 | +
|
| 2347 | + metadata = MetaData.naming_convention = { |
| 2348 | + "ck": "ck_%(table_name)s_%(constraint_name)s", |
| 2349 | + "pk": "pk_%(table_name)s", |
| 2350 | + } |
| 2351 | +
|
| 2352 | + Base = declarative_base(metadata=metadata) |
| 2353 | +
|
| 2354 | +
|
| 2355 | + class Simple(Base): |
| 2356 | + __tablename__ = 'simple' |
| 2357 | + __table_args__ = ( |
| 2358 | + CheckConstraint('id > 0', name='idcheck'), |
| 2359 | + CheckConstraint('number > 0', name=conv('non_default_name')) |
| 2360 | + ) |
| 2361 | +
|
| 2362 | + id = Column(Integer, primary_key=True) |
| 2363 | + number = Column(Integer) |
| 2364 | + """, |
| 2365 | + ) |
| 2366 | + |
2249 | 2367 |
|
2250 | 2368 | class TestDataclassGenerator: |
2251 | 2369 | @pytest.fixture |
|
0 commit comments