如何将Python/Pandas数据插入规范化数据库

如何将Python/Pandas数据插入规范化数据库,python,sql,pandas,sqlalchemy,database-normalization,Python,Sql,Pandas,Sqlalchemy,Database Normalization,假设我有一个熊猫数据框,其中包含以下记录: Time Action User Company User2 --------------------------------------------------- 00:02 buy share msmith ACME tjones 00:03 sell share tjones Alpha msmith ... 我有一个带表的数据库: ActionType (ID INT IDE

假设我有一个熊猫数据框,其中包含以下记录:

Time    Action      User    Company    User2
---------------------------------------------------
00:02   buy share   msmith  ACME       tjones
00:03   sell share  tjones  Alpha      msmith
...
我有一个带表的数据库:

ActionType (ID INT IDENTITY(1,1), Name VARCHAR)

Users (ID INT IDENTITY(1,1), Username VARCHAR, CompanyID INT FOREIGN KEY)

Companies (ID INT IDENTITY(1,1), CompanyName VARCHAR)

Events (ID INT IDENTITY(1,1), ActionID INT FOREIGN KEY, UserID INT FOREIGN KEY, CompanyID INT FOREIGN KEY, User2ID INT FOREIGN KEY)
我想将数据框插入events表,但我希望它存储每列的关联ID,而不是原始文本。有没有一种方法可以通过SQLAlchemy(或其他RDBMS或ORM包)轻松做到这一点,或者我需要逐行设置变量,例如

userid = session.query(Users).filter(Users.Username == df.User) 
或者,通过数据库处理此问题的最佳方法是什么?我可以通过将原始数据直接插入到“staging”表中,然后使用SQL将数据点拆分到各自的表中来实现这一点

这似乎是可行的,我只是想看看是否有一个更有效的解决方案通过Python


额外的(可能是单独的)问题,如果遇到新值(即df.User不在Users表中,因此我想
插入Users值…

如果您的源数据还没有代理键值,并且只有像“购买共享”这样的文本值,我将如何在表中输入新值,“出售股份”则确定“ActionType”表中是否存在该值的唯一方法是查找其文本值,因此,您也可以将该文本值用作自然主键,而不是任意分配标识主键。如果源数据没有代理键值,并且只有“buy share”、“sell share”等文本值,那么您可以确定该值是否存在于“ActionType”中的唯一方法表的作用是查找其文本值,所以您最好将该文本值用作自然主键,而不是任意分配标识主键。