
('Nora' und 'Musik'... da war mal was. Aber das ist hier nun völllig Offtopic!)
Was ich da fragen wollte:
Code: Alles auswählen
materials (22) [Materialien mit Zuordnungen der Kunden (Materialdaten kommen von der datanorm)]
Pandas werde ich jetzt verwenden um einfacher auf die Daten zurückgreifen zu können:sparrow hat geschrieben: ↑Donnerstag 18. Mai 2023, 16:33 @Kalysto: Ja klar bleibt eine manufacturer_id in der Tabelle. Aber du hast andere Spalten, die sich ebenfalls auf den Hersteller beziehen. Die müssen aus der Tabelle raus. "Manufacturer" ist eine eigene Relation. Und darin enthalten ist u.a. der Name.
Wie gesagt, lies bitte den Wikipedia-Artikel. Der erklärt Noralisierung wirklich gut anhand von Musikalben.
Ich sehe das ebenso, wie andere Leute hier im Thread. Du verwechselst eine relationale Datenbank mit einer Tabellenkalkulation.
Und ich sehe auch nicht, warum man hier Pandas benutzen muss. Ich würde das mit einer vernünftigen und sauberen Datenbankstruktur aufsetzen und SQLAlchemy benutzen. Den Mehrwert von Pandas sehe ich hier nicht.
Code: Alles auswählen
df = pd.read_sql('SELECT * FROM datanorm', con=db_connection, index_col = 'ID')
print(df.loc[31]['qr_codes'])
etc.
.
..
...
....
Das war so gemeint wenn ich mit der App Materialien in die materials Tabelle hinzufüge das diese Daten von der datanorm stammen und nicht händisch etc. eingetragen werden.grubenfox hat geschrieben: ↑Donnerstag 18. Mai 2023, 17:15Was ich da fragen wollte:
Wie ist das mit dem"(Materialdaten kommen von der datanorm)" gemeint? Gibt es da eine View die die Daten aus der Tabelle 'materials' und den dazugehörigen Daten aus 'datanorm' zurückliefert? Oder eine Python-Funktion/Methode?Code: Alles auswählen
materials (22) [Materialien mit Zuordnungen der Kunden (Materialdaten kommen von der datanorm)]
Okay, dann schau ich mir die SQLAlchemy ORM einmal an wie das dort funktioniert.sparrow hat geschrieben: ↑Donnerstag 18. Mai 2023, 19:15 @grubenfox: Ja Mensch, lustig.
@Kalysto: Vergiss Pandas in diesem Zusammenhang. Du musst auch keine Arrays selber bauen. SQLAlchemy kann neben dem rohen SQL-Zugriff ORM. Arbeite das Tutorial durch. Das was du da versuchst scheint eher so, als würdest du entweder das falsche Backend für Pandas verwenden (das wurde hier auch schon gesagt. Wenn du nicht bereit bist eine relationale Datenbank zu relational zu verwenden, dann solltest du gar keine verwenden) oder du missbrauchst Pandas als ORM, wofür du denfinitiv SQLAlchemy direkt nehmen solltest.
In der Konstellation, wie du es verwendest, halte ich das für völlig falsch.
Beim relationalen Datenbankdesign sollte man versuchen, gar keine Duplikate oder Redundanzen zu erhalten. Du kannst versuchen, kleinere Tabellen zu machen, ich habe mir immer einen Plan gezeichnet, sowas wie das hier:ab wann muss oder sollte man das aufsplittern in mehreren Tabellen.
Code: Alles auswählen
from sqlalchemy import create_engine, Column, Integer, String, Boolean, ForeignKey, Date
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relationship
# Verbindung zur Datenbank herstellen
engine = create_engine('your_database_url')
Base = declarative_base()
class Customer(Base):
__tablename__ = 'customers'
id = Column(Integer, primary_key=True, autoincrement=True)
customer_id = Column(Integer, unique=True)
is_company = Column(Boolean)
is_favorite = Column(Boolean)
user_name = Column(String)
user_name_update = Column(String)
company = Column(String)
first_name = Column(String)
last_name = Column(String)
place = Column(String)
customer_projects = relationship('Project', back_populates='customer')
date_create = Column(Date)
date_update = Column(Date)
class Datanorm(Base):
__tablename__ = 'datanorm'
id = Column(Integer, primary_key=True, autoincrement=True)
qr_code = Column(String)
ean_code = Column(String)
user_name = Column(String)
user_name_update = Column(String)
sort_number = Column(Integer)
manufacturer_id = Column(Integer, ForeignKey('manufacturers.manufacturer_id'))
manufacturer = Column(String)
manufacturer_designation = Column(String)
manufacturer_designation_short = Column(String)
manufacturer_number = Column(String)
supplier_xyz_number = Column(String)
deactivated_xyz = Column(Boolean)
supplier_other_number = Column(String)
supplier_other_name = Column(String)
deactivated_other = Column(Boolean)
count = Column(Integer)
material_inventory = Column(Integer)
per_piece = Column(String)
purchasing_price = Column(Float)
selling_price = Column(Float)
update_price = Column(Date)
cutting = Column(Boolean)
inventory = Column(String)
inventory_lite = Column(String)
inventory_query = Column(String)
inventory_order_quantity = Column(Integer)
date_create = Column(Date)
date_update = Column(Date)
date_out = Column(Date)
class Manufacturer(Base):
__tablename__ = 'manufacturers'
id = Column(Integer, primary_key=True, autoincrement=True)
manufacturer_id = Column(Integer, unique=True)
user_name = Column(String)
user_name_update = Column(String)
manufacturer = Column(String)
area_from = Column(Integer)
area_to = Column(Integer)
in_use = Column(Boolean)
max_use = Column(Integer)
date_create = Column(Date)
date_update = Column(Date)
materials = relationship('Datanorm', back_populates='manufacturer')
class Material(Base):
__tablename__ = 'materials'
id = Column(Integer, primary_key=True, autoincrement=True)
datanorm_id = Column(Integer, ForeignKey('datanorm.id'))
customer_id = Column(Integer, ForeignKey('customers.customer_id'))
project_id = Column(Integer, ForeignKey('projects.project_id'))
user_name = Column(String)
user_name_update = Column(String)
sort_number = Column(Integer)
manufacturer_id = Column(Integer, ForeignKey('manufacturers.manufacturer_id'))
manufacturer = Column(String)
manufacturer_designation = Column(String)
manufacturer_designation_short = Column(String)
manufacturer_number = Column(String)
supplier_xyz_number = Column(String)
supplier_other_number = Column(String)
comment = Column(String)
count = Column(Integer)
count_interim_bill = Column(Integer)
selling_price = Column(Float)
update_price = Column(Date)
date_create = Column(Date)
date_update = Column(Date)
date_closed = Column(Date)
class Project(Base):
__tablename__ = 'projects'
id = Column(Integer, primary_key=True, autoincrement=True)
customer_id = Column(Integer, ForeignKey('customers.customer_id'))
project_id = Column(Integer, unique=True)
user_name = Column(String)
user_name_update = Column(String)
user_name_closed = Column(String)
customer_project = Column(String)
interim_bill = Column(Boolean)
closed = Column(Boolean)
date_create = Column(Date)
date_update = Column(Date)
date_closed = Column(Date)
customer = relationship('Customer', back_populates='customer_projects')
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True, autoincrement=True)
device_id = Column(String)
name = Column(String)
mail = Column(String)
role = Column(String)
password = Column(String)
class Version(Base):
__tablename__ = 'version'
id = Column(Integer, primary_key=True, autoincrement=True)
file = Column(String)
version = Column(String)
build = Column(String)
file_stamp = Column(String)
update_needed = Column(Boolean)
update_price = Column(Integer)
# Die Tabellen erstellen
Base.metadata.create_all(engine)
Beim relationalen Datenbankdesign sollte man versuchen, gar keine Duplikate oder Redundanzen zu erhalten. Du kannst versuchen, kleinere Tabellen zu machen, ich habe mir immer einen Plan gezeichnet, sowas wie das hier:[...] ab wann muss oder sollte man das aufsplittern (sic!) in mehreren Tabellen.
Das wäre eine Möglichkeit, Tabelle Ort mit den Spalten ID, User-ID, Kunden-ID, Hersteller-ID, Ort-ID, Adresse, PLZ, Straße etc., damit könntest du die Orte von Projekten, Kunden und Usern verknüpfen... und entsprechend auch per Query selektiv oder allgemein abrufen.Sollte ich dann z.b. den Ort und das Kundenprojekte in eine eigene Tabelle schreiben und anhand ID's "verknüpfen" sodass es in Ordnung wäre ?
Code: Alles auswählen
from sqlalchemy import create_engine, Column, Integer, String, Boolean, ForeignKey, Date
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relationship
# Verbindung zur Datenbank herstellen
engine = create_engine('your_database_url')
Base = declarative_base()
class Customer(Base):
__tablename__ = 'customers'
id = Column(Integer, primary_key=True, autoincrement=True)
customer_id = Column(Integer, unique=True)
is_company = Column(Boolean)
is_favorite = Column(Boolean)
user_name = Column(String)
user_name_update = Column(String)
company = Column(String)
first_name = Column(String)
last_name = Column(String)
place = Column(String)
customer_projects = relationship('Project', back_populates='customer')
date_create = Column(Date)
date_update = Column(Date)
class Datanorm(Base):
__tablename__ = 'datanorm'
id = Column(Integer, primary_key=True, autoincrement=True)
qr_code = Column(String)
ean_code = Column(String)
user_name = Column(String)
user_name_update = Column(String)
sort_number = Column(Integer)
manufacturer_id = Column(Integer, ForeignKey('manufacturers.manufacturer_id'))
manufacturer = Column(String)
manufacturer_designation = Column(String)
manufacturer_designation_short = Column(String)
manufacturer_number = Column(String)
supplier_xyz_number = Column(String)
deactivated_xyz = Column(Boolean)
supplier_other_number = Column(String)
supplier_other_name = Column(String)
deactivated_other = Column(Boolean)
count = Column(Integer)
material_inventory = Column(Integer)
per_piece = Column(String)
purchasing_price = Column(Float)
selling_price = Column(Float)
update_price = Column(Date)
cutting = Column(Boolean)
inventory = Column(String)
inventory_lite = Column(String)
inventory_query = Column(String)
inventory_order_quantity = Column(Integer)
date_create = Column(Date)
date_update = Column(Date)
date_out = Column(Date)
class Manufacturer(Base):
__tablename__ = 'manufacturers'
id = Column(Integer, primary_key=True, autoincrement=True)
manufacturer_id = Column(Integer, unique=True)
user_name = Column(String)
user_name_update = Column(String)
manufacturer = Column(String)
area_from = Column(Integer)
area_to = Column(Integer)
in_use = Column(Boolean)
max_use = Column(Integer)
date_create = Column(Date)
date_update = Column(Date)
materials = relationship('Datanorm', back_populates='manufacturer')
class Material(Base):
__tablename__ = 'materials'
id = Column(Integer, primary_key=True, autoincrement=True)
datanorm_id = Column(Integer, ForeignKey('datanorm.id'))
customer_id = Column(Integer, ForeignKey('customers.customer_id'))
project_id = Column(Integer, ForeignKey('projects.project_id'))
user_name = Column(String)
user_name_update = Column(String)
sort_number = Column(Integer)
manufacturer_id = Column(Integer, ForeignKey('manufacturers.manufacturer_id'))
manufacturer = Column(String)
manufacturer_designation = Column(String)
manufacturer_designation_short = Column(String)
manufacturer_number = Column(String)
supplier_xyz_number = Column(String)
supplier_other_number = Column(String)
comment = Column(String)
count = Column(Integer)
count_interim_bill = Column(Integer)
selling_price = Column(Float)
update_price = Column(Date)
date_create = Column(Date)
date_update = Column(Date)
date_closed = Column(Date)
class Project(Base):
__tablename__ = 'projects'
id = Column(Integer, primary_key=True, autoincrement=True)
customer_id = Column(Integer, ForeignKey('customers.customer_id'))
project_id = Column(Integer, unique=True)
user_name = Column(String)
user_name_update = Column(String)
user_name_closed = Column(String)
customer_project = Column(String)
interim_bill = Column(Boolean)
closed = Column(Boolean)
date_create = Column(Date)
date_update = Column(Date)
date_closed = Column(Date)
customer = relationship('Customer', back_populates='customer_projects')
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True, autoincrement=True)
device_id = Column(String)
name = Column(String)
mail = Column(String)
role = Column(String)
password = Column(String)
class Version(Base):
__tablename__ = 'version'
id = Column(Integer, primary_key=True, autoincrement=True)
file = Column(String)
version = Column(String)
build = Column(String)
file_stamp = Column(String)
update_needed = Column(Boolean)
update_price = Column(Integer)
# Die Tabellen erstellen
Base.metadata.create_all(engine)