File size: 8,346 Bytes
560d5c2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
from sqlalchemy import (
    Boolean,
    Column,
    DateTime,
    ForeignKey,
    Integer,
    Numeric,
    SmallInteger,
    String,
    Text,
)
from sqlalchemy.orm import relationship

from .database import Base


class Actor(Base):
    __tablename__ = "actor"

    actor_id = Column(Integer, primary_key=True)
    first_name = Column(String(45), nullable=False)
    last_name = Column(String(45), nullable=False)
    last_update = Column(DateTime, nullable=False)
    films = relationship("Film", secondary="film_actor", back_populates="actors")


class Category(Base):
    __tablename__ = "category"

    category_id = Column(SmallInteger, primary_key=True)
    name = Column(String(25), nullable=False)
    last_update = Column(DateTime, nullable=False)
    films = relationship("Film", secondary="film_category", back_populates="categories")


class Film(Base):
    __tablename__ = "film"

    film_id = Column(Integer, primary_key=True)
    title = Column(String(255), nullable=False)
    description = Column(Text)
    release_year = Column(String(4))
    language_id = Column(SmallInteger, ForeignKey("language.language_id"), nullable=False)
    original_language_id = Column(SmallInteger, ForeignKey("language.language_id"))
    rental_duration = Column(SmallInteger, nullable=False, default=3)
    rental_rate = Column(Numeric(4, 2), nullable=False, default=4.99)
    length = Column(SmallInteger)
    replacement_cost = Column(Numeric(5, 2), nullable=False, default=19.99)
    rating = Column(String(10), default="G")
    special_features = Column(String(100))
    last_update = Column(DateTime, nullable=False)
    language = relationship("Language", foreign_keys=[language_id])
    original_language = relationship("Language", foreign_keys=[original_language_id])
    inventory = relationship("Inventory", back_populates="film")
    actors = relationship("Actor", secondary="film_actor", back_populates="films")
    categories = relationship("Category", secondary="film_category", back_populates="films")


class Customer(Base):
    __tablename__ = "customer"

    customer_id = Column(Integer, primary_key=True)
    store_id = Column(Integer, ForeignKey("store.store_id"), nullable=False)
    first_name = Column(String(45), nullable=False)
    last_name = Column(String(45), nullable=False)
    email = Column(String(50))
    address_id = Column(Integer, ForeignKey("address.address_id"), nullable=False)
    active = Column(Boolean, nullable=False, default=True)
    create_date = Column(DateTime, nullable=False)
    last_update = Column(DateTime, nullable=False)
    store = relationship("Store", back_populates="customers")
    address = relationship("Address", back_populates="customers")
    rentals = relationship("Rental", back_populates="customer")
    payments = relationship("Payment", back_populates="customer")


class Store(Base):
    __tablename__ = "store"

    store_id = Column(Integer, primary_key=True)
    manager_staff_id = Column(SmallInteger, ForeignKey("staff.staff_id"), nullable=False)
    address_id = Column(Integer, ForeignKey("address.address_id"), nullable=False)
    last_update = Column(DateTime, nullable=False)
    address = relationship("Address", back_populates="stores")
    manager = relationship("Staff", foreign_keys=[manager_staff_id])
    inventory = relationship("Inventory", back_populates="store")
    customers = relationship("Customer", back_populates="store")


class Rental(Base):
    __tablename__ = "rental"

    rental_id = Column(Integer, primary_key=True)
    rental_date = Column(DateTime, nullable=False)
    inventory_id = Column(Integer, ForeignKey("inventory.inventory_id"), nullable=False)
    customer_id = Column(Integer, ForeignKey("customer.customer_id"), nullable=False)
    return_date = Column(DateTime)
    staff_id = Column(SmallInteger, ForeignKey("staff.staff_id"), nullable=False)
    last_update = Column(DateTime, nullable=False)
    inventory = relationship("Inventory", back_populates="rentals")
    customer = relationship("Customer", back_populates="rentals")
    staff = relationship("Staff", back_populates="rentals")
    payments = relationship("Payment", back_populates="rental")


class Payment(Base):
    __tablename__ = "payment"

    payment_id = Column(Integer, primary_key=True)
    customer_id = Column(Integer, ForeignKey("customer.customer_id"), nullable=False)
    staff_id = Column(SmallInteger, ForeignKey("staff.staff_id"), nullable=False)
    rental_id = Column(Integer, ForeignKey("rental.rental_id"))
    amount = Column(Numeric(5, 2), nullable=False)
    payment_date = Column(DateTime, nullable=False)
    last_update = Column(DateTime, nullable=False)
    customer = relationship("Customer", back_populates="payments")
    staff = relationship("Staff", back_populates="payments")
    rental = relationship("Rental", back_populates="payments")


class Country(Base):
    __tablename__ = "country"

    country_id = Column(SmallInteger, primary_key=True)
    country = Column(String(50), nullable=False)
    last_update = Column(DateTime)
    cities = relationship("City", back_populates="country")


class City(Base):
    __tablename__ = "city"

    city_id = Column(Integer, primary_key=True)
    city = Column(String(50), nullable=False)
    country_id = Column(SmallInteger, ForeignKey("country.country_id"), nullable=False)
    last_update = Column(DateTime, nullable=False)
    country = relationship("Country", back_populates="cities")
    addresses = relationship("Address", back_populates="city")


class Address(Base):
    __tablename__ = "address"

    address_id = Column(Integer, primary_key=True)
    address = Column(String(50), nullable=False)
    address2 = Column(String(50))
    district = Column(String(20), nullable=False)
    city_id = Column(Integer, ForeignKey("city.city_id"), nullable=False)
    postal_code = Column(String(10))
    phone = Column(String(20), nullable=False)
    last_update = Column(DateTime, nullable=False)
    city = relationship("City", back_populates="addresses")
    stores = relationship("Store", back_populates="address")
    customers = relationship("Customer", back_populates="address")
    staff = relationship("Staff", back_populates="address")


class Staff(Base):
    __tablename__ = "staff"

    staff_id = Column(SmallInteger, primary_key=True)
    first_name = Column(String(45), nullable=False)
    last_name = Column(String(45), nullable=False)
    address_id = Column(Integer, ForeignKey("address.address_id"), nullable=False)
    picture = Column(Text)
    email = Column(String(50))
    store_id = Column(Integer, ForeignKey("store.store_id"), nullable=False)
    active = Column(SmallInteger, nullable=False, default=1)
    username = Column(String(16), nullable=False)
    password = Column(String(40))
    last_update = Column(DateTime, nullable=False)
    address = relationship("Address", back_populates="staff")
    store = relationship("Store", foreign_keys=[store_id])
    rentals = relationship("Rental", back_populates="staff")
    payments = relationship("Payment", back_populates="staff")


class Language(Base):
    __tablename__ = "language"

    language_id = Column(SmallInteger, primary_key=True)
    name = Column(String(20), nullable=False)
    last_update = Column(DateTime, nullable=False)


class Inventory(Base):
    __tablename__ = "inventory"

    inventory_id = Column(Integer, primary_key=True)
    film_id = Column(Integer, ForeignKey("film.film_id"), nullable=False)
    store_id = Column(Integer, ForeignKey("store.store_id"), nullable=False)
    last_update = Column(DateTime, nullable=False)
    film = relationship("Film", back_populates="inventory")
    store = relationship("Store", back_populates="inventory")
    rentals = relationship("Rental", back_populates="inventory")


class FilmActor(Base):
    __tablename__ = "film_actor"

    actor_id = Column(Integer, ForeignKey("actor.actor_id"), primary_key=True)
    film_id = Column(Integer, ForeignKey("film.film_id"), primary_key=True)
    last_update = Column(DateTime, nullable=False)


class FilmCategory(Base):
    __tablename__ = "film_category"

    film_id = Column(Integer, ForeignKey("film.film_id"), primary_key=True)
    category_id = Column(SmallInteger, ForeignKey("category.category_id"), primary_key=True)
    last_update = Column(DateTime, nullable=False)