Sqlalchemy и автоматический скрипт: двойное значение ключа нарушает уникальное ограничение - PullRequest
0 голосов
/ 01 мая 2019

Я использую sqlalchemy в качестве ORM для взаимодействия в python с базой данных Postgresql.Я разработал классы Python, определяющие модели данных sqlalchemy.Вот мой пример использования: в файле Excel я определил для каждой модели данных лист с данными.В каждом рабочем листе столбцы соответствуют переменным и строкам данных.

Я написал скрипт на Python, который читает файл Excel, я создаю строки в postgresl для каждой строки на листе.Эта часть работает !!

MODELS_CONSTRUCTORS = [ # Python Classes defining Sqalalchemy models
    {"User" : User()},
    {"Entity" : Entity()},
    {"BusinessProfile" : BusinessProfile()},
    {"Role" : Role()}
]

CONNECTOR = SqlaConnector()
SESSION = SqlaConnector().session
ENGINE = SqlaConnector().engine

def create_dataset():
    try:

        # Initialize Models
        ###### SECTION THAT WORKS ########
        for model_constructor in MODELS_CONSTRUCTORS:
            for model, constructor in model_constructor.items():
                dataframe = pd.read_excel(xls, model).fillna("") # xls : content of an excel file retrieved with pandas
                for index in dataframe.index:
                    new_instance_of_model = constructor
                    for column in dataframe.columns:
                        setattr(new_instance_of_model, column_name, str(dataframe[column][index]))
                    make_transient(new_instance_of_model) 
                    SESSION.add(new_instance_of_model) # sqlalchemy session
                    SESSION.commit()
        ##########################################
        ###### SECTION THAT DOES NOT WORK ########
        print("test insert user (manual)")
        new_user = User()
        new_user.firstname = "myFirstname2"
        new_user.lastname = "myLastname2"
        new_user.email = "myEmail12@myBox.com"
        new_user.status="Unconfirmed"
        SESSION.add(new_user)
        SESSION.commit()
        print("END")
        ##########################################
    except Exception as ex:
        print("Error in data initialization. %s" % str(ex))
        SESSION.rollback()

Однако, когда я пытаюсь обычным способом создать новый элемент (например, нового пользователя), я получаю следующую ошибку:

sqlalchemy.exc.IntegrityError
IntegrityError: (IntegrityError) duplicate key value violates unique constraint "users_key"
DETAIL:  Key (id)=(1) already exists. # id is the primary key in my data model

Кажется, что sqlalchemy не может обнаружить, что в базе данных уже есть пользователи, и попытаться вставить пользователя в первую строку (следовательно, DETAIL: Key (id) = (1) уже существует)

Я был быочень благодарен, если вы можете помочь с этим вопросом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...