modify schema primary keys to be nullable+defaulted

This fixes SQLAlchemy warnings related to primary keys not
having an auto_increment or nullable.

We've done this by making all foreign primary keys nullable.

In ApiRateLimit's case, we can set a default str to act as
a null, which seems a bit more sensible.

Signed-off-by: Kevin Morris <kevr@0cost.org>
This commit is contained in:
Kevin Morris 2021-06-04 00:31:15 -07:00
parent e5df083d45
commit d7481b9649
5 changed files with 42 additions and 11 deletions

View file

@ -1,4 +1,5 @@
from sqlalchemy.orm import mapper from sqlalchemy.orm import mapper
from sqlalchemy.exc import IntegrityError
from aurweb.db import make_relationship from aurweb.db import make_relationship
from aurweb.models.group import Group from aurweb.models.group import Group
@ -9,7 +10,18 @@ from aurweb.schema import PackageGroups
class PackageGroup: class PackageGroup:
def __init__(self, Package: Package = None, Group: Group = None): def __init__(self, Package: Package = None, Group: Group = None):
self.Package = Package self.Package = Package
if not self.Package:
raise IntegrityError(
statement="Primary key PackageID cannot be null.",
orig="PackageGroups.PackageID",
params=("NULL"))
self.Group = Group self.Group = Group
if not self.Group:
raise IntegrityError(
statement="Primary key GroupID cannot be null.",
orig="PackageGroups.GroupID",
params=("NULL"))
properties = { properties = {

View file

@ -1,4 +1,5 @@
from sqlalchemy.orm import mapper from sqlalchemy.orm import mapper
from sqlalchemy.exc import IntegrityError
from aurweb.db import make_relationship from aurweb.db import make_relationship
from aurweb.models.package_base import PackageBase from aurweb.models.package_base import PackageBase
@ -10,6 +11,12 @@ class PackageKeyword:
PackageBase: PackageBase = None, PackageBase: PackageBase = None,
Keyword: str = None): Keyword: str = None):
self.PackageBase = PackageBase self.PackageBase = PackageBase
if not self.PackageBase:
raise IntegrityError(
statement="Primary key PackageBaseID cannot be null.",
orig="PackageKeywords.PackageBaseID",
params=("NULL"))
self.Keyword = Keyword self.Keyword = Keyword

View file

@ -1,4 +1,5 @@
from sqlalchemy.orm import mapper from sqlalchemy.orm import mapper
from sqlalchemy.exc import IntegrityError
from aurweb.db import make_relationship from aurweb.db import make_relationship
from aurweb.models.license import License from aurweb.models.license import License
@ -9,7 +10,18 @@ from aurweb.schema import PackageLicenses
class PackageLicense: class PackageLicense:
def __init__(self, Package: Package = None, License: License = None): def __init__(self, Package: Package = None, License: License = None):
self.Package = Package self.Package = Package
if not self.Package:
raise IntegrityError(
statement="Primary key PackageID cannot be null.",
orig="PackageLicenses.PackageID",
params=("NULL"))
self.License = License self.License = License
if not self.License:
raise IntegrityError(
statement="Primary key LicenseID cannot be null.",
orig="PackageLicenses.LicenseID",
params=("NULL"))
properties = { properties = {
@ -21,6 +33,8 @@ properties = {
PackageLicenses.c.LicenseID, PackageLicenses.c.LicenseID,
"package_license", "package_license",
uselist=False) uselist=False)
} }
mapper(PackageLicense, PackageLicenses, properties=properties, mapper(PackageLicense, PackageLicenses, properties=properties,

View file

@ -133,7 +133,7 @@ PackageBases = Table(
# Keywords of package bases # Keywords of package bases
PackageKeywords = Table( PackageKeywords = Table(
'PackageKeywords', metadata, 'PackageKeywords', metadata,
Column('PackageBaseID', ForeignKey('PackageBases.ID', ondelete='CASCADE'), primary_key=True, nullable=False), Column('PackageBaseID', ForeignKey('PackageBases.ID', ondelete='CASCADE'), primary_key=True, nullable=True),
Column('Keyword', String(255), primary_key=True, nullable=False, server_default=text("''")), Column('Keyword', String(255), primary_key=True, nullable=False, server_default=text("''")),
mysql_engine='InnoDB', mysql_engine='InnoDB',
mysql_charset='utf8mb4', mysql_charset='utf8mb4',
@ -170,8 +170,8 @@ Licenses = Table(
# Information about package-license-relations # Information about package-license-relations
PackageLicenses = Table( PackageLicenses = Table(
'PackageLicenses', metadata, 'PackageLicenses', metadata,
Column('PackageID', ForeignKey('Packages.ID', ondelete='CASCADE'), primary_key=True, nullable=False), Column('PackageID', ForeignKey('Packages.ID', ondelete='CASCADE'), primary_key=True, nullable=True),
Column('LicenseID', ForeignKey('Licenses.ID', ondelete='CASCADE'), primary_key=True, nullable=False), Column('LicenseID', ForeignKey('Licenses.ID', ondelete='CASCADE'), primary_key=True, nullable=True),
mysql_engine='InnoDB', mysql_engine='InnoDB',
) )
@ -190,8 +190,8 @@ Groups = Table(
# Information about package-group-relations # Information about package-group-relations
PackageGroups = Table( PackageGroups = Table(
'PackageGroups', metadata, 'PackageGroups', metadata,
Column('PackageID', ForeignKey('Packages.ID', ondelete='CASCADE'), primary_key=True, nullable=False), Column('PackageID', ForeignKey('Packages.ID', ondelete='CASCADE'), primary_key=True, nullable=True),
Column('GroupID', ForeignKey('Groups.ID', ondelete='CASCADE'), primary_key=True, nullable=False), Column('GroupID', ForeignKey('Groups.ID', ondelete='CASCADE'), primary_key=True, nullable=True),
mysql_engine='InnoDB', mysql_engine='InnoDB',
) )
@ -445,7 +445,7 @@ AcceptedTerms = Table(
# Rate limits for API # Rate limits for API
ApiRateLimit = Table( ApiRateLimit = Table(
'ApiRateLimit', metadata, 'ApiRateLimit', metadata,
Column('IP', String(45), primary_key=True), Column('IP', String(45), primary_key=True, unique=True, default=str()),
Column('Requests', INTEGER(11), nullable=False), Column('Requests', INTEGER(11), nullable=False),
Column('WindowStart', BIGINT(20), nullable=False), Column('WindowStart', BIGINT(20), nullable=False),
Index('ApiRateLimitWindowStart', 'WindowStart'), Index('ApiRateLimitWindowStart', 'WindowStart'),

View file

@ -19,11 +19,9 @@ def test_api_rate_key_creation():
assert rate.WindowStart == 1 assert rate.WindowStart == 1
def test_api_rate_key_null_ip_raises_exception(): def test_api_rate_key_ip_default():
from aurweb.db import session api_rate_limit = create(ApiRateLimit, Requests=10, WindowStart=1)
with pytest.raises(IntegrityError): assert api_rate_limit.IP == str()
create(ApiRateLimit, Requests=10, WindowStart=1)
session.rollback()
def test_api_rate_key_null_requests_raises_exception(): def test_api_rate_key_null_requests_raises_exception():