在Python中使用SQLAlchemy ORM在MySQL中创建外键

2024-05-29 04:10:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个在MySQL数据库中创建3个表的类,我希望这些表与第一个表的主键和链接到该主键的其他表中的外键连接

我已经在Python中使用SQLAlchemy构建了它

class Database:
    def __init__(self):
        self.engine = sqlalchemy.create_engine(
            'mysql+mysqldb://{}:{}@{}/{}'.format(self.USER, self.PASSWORD,
                                                 self.HOST, self.DB_NAME))
        self.create_strategies_table()
        self.create_renko_bars_table()
        self.create_trades_table()

    def create_strategies_table(self):
        meta = MetaData()
        self.strategies = Table(
            'strategies',
            meta,

            # PRIMARY KEY
            Column('id', CHAR(32), primary_key=True, nullable=False),

            Column('start_time', DATETIME, nullable=False),
            Column('symbol', TEXT(), nullable=False),
            Column('brick_size', DOUBLE(), nullable=False),
            Column('method', TEXT(), nullable=False),
            Column('entry_points', TEXT(), nullable=True),
            Column('exit_points', TEXT(), nullable=True),
            Column('take_profit', INTEGER(), nullable=True),
            Column('stop_loss', INTEGER(), nullable=True),
            Column('balance', DOUBLE(), nullable=True),
            Column('trades', INTEGER(), nullable=True),
        )
        meta.create_all(self.engine, tables=[self.strategies], checkfirst=True)

    def create_renko_bars_table(self):
        meta = MetaData()
        self.renko_bars = Table(
            'renko_bars',
            meta,

            # ADD FOREIGN KEY HERE -> strategies.id
            Column(CHAR(32), ForeignKey('strategies.id'), nullable=False),

            Column('price_last', DOUBLE(), nullable=False),
            Column('price_renko', DOUBLE(), nullable=False),
            Column('price_min', DOUBLE(), nullable=False),
            Column('price_max', DOUBLE(), nullable=False),
            Column('dt_start', DATETIME(), nullable=False),
            Column('dt_end', DATETIME(), nullable=False),
            Column('trend', INTEGER(), nullable=False),
            Column('volume', BIGINT(), nullable=False),
            Column('count', INTEGER(), nullable=False),
            Column('cons_up', INTEGER(), nullable=False),
            Column('cons_down', INTEGER(), nullable=False),
        )
        meta.create_all(self.engine, tables=[self.renko_bars], checkfirst=True)

    def create_trades_table(self):
        meta = MetaData()
        self.trades = Table(
            'trades',
            meta,

            # ADD FOREIGN KEY HERE -> strategies.id
            Column(CHAR(32), ForeignKey('strategies.id'), nullable=False),

            Column('symbol', TEXT(), nullable=False),
            Column('side', INTEGER(), nullable=False),
            Column('size', BIGINT(), nullable=False),
            Column('entry_time', DATETIME(), nullable=False),
            Column('exit_time', DATETIME(), nullable=False),
            Column('entry_price', DOUBLE(), nullable=False),
            Column('exit_price', DOUBLE(), nullable=False),
            Column('entry_reason', TEXT(), nullable=True),
            Column('exit_reason', TEXT(), nullable=True),
            Column('pal', DOUBLE(), nullable=False),
            Column('net_pal', DOUBLE(), nullable=False),
            Column('commissions', DOUBLE(), nullable=False),
        )
        meta.create_all(self.engine, tables=[self.trades], checkfirst=True)

我在其他线程中注意到,其他线程正在使用SQLAlchemy构建模型(一个类)来构造表,我不确定您将如何以我使用它的方式来实现它

在这里实现上述外键的正确方法是什么

谢谢大家!


Tags: textselffalsetruecreatetablecolumninteger

热门问题