0

I have a SQLAlchemy Table which is defined as:

class Student(db.Model):
    id = db.Column(db.Integer(), primary_key=True)
    name = db.Column(db.Text(), nullable=False)

I am loading this table with data from a .csv file, and I may have columns which are not defined statically in the Student class. Let's say while loading the file, I find a new column that is not in the database, so I need to add it to the Student class.

So far I have tried this:

from alembic.migration import MigrationContext
from alembic.operations import Operations
from sqlalchemy.exc import OperationalError
    
op = Operations(MigrationContext.configure(db.engine.connect()))
    
return_col_list = []
for col_name in headers_list:
    # If the column is not already in the database, then create it.
    if (col_name not in COLUMN_HEADER_NAMES):
        lower_col_name = col_name.lower()
        try: 
            op.add_column('students', Column(lower_col_name, Text)) # Add the column
            Student.__table__.append_column(Column(lower_col_name, Text)) # Append the column to the table.
            return_col_list.append(col_name)
        except OperationalError:
            # The column already exists in the table.
            pass
    
return return_col_list    

Then when I loop over each row of my .csv file, I do this to set the data to the attribute.

setattr(new_student, col, val)

However, when I set the data on a given Student object, the data is not reflected in the database. It appears there is no "link" between the column I made and the SQLite table itself. Does anyone know of a better way to do this?

davidism
  • 121,510
  • 29
  • 395
  • 339

0 Answers0