簡體   English   中英

將python sqlalchemy類轉換為原始SQL(使用外鍵創建表)

[英]Turn python sqlalchemy class into raw SQL (create table with foreign key)

我有一個python應用程序,並且使用sqlalchemy和posgreSQL。 我已經在數據庫中有一些數據,並且不想重新創建它,所以我想向數據庫中添加一個表並保留所有數據(之前我使用alembic,但是這次我想使用原始SQL)。

這是我的新表,我想用python將其添加到數據庫中:

# User payed data
class UserPayData(Base):
    __tablename__ = 'userspaydata'
    id = Column(Integer, primary_key=True) 
    account_owner = Column(Text, nullable=False)
    IBAN = Column(Text, nullable=False)
    # Foreign Keys
    belongs_to_user_id = Column(Integer, ForeignKey('users.id'))
    payment_belongs_to_user_relation = relationship("User", back_populates="payment_belongs_to_user_addresses")

    def __init__(self, account_owner=None, IBAN=None):
        self.account_owner = account_owner
        self.IBAN = IBAN

    def get(self, id):
        if self.id == id:
            return self
        else:
            return None

    def __repr__(self):
        return '<%s(%r, %r, %r)>' % (self.__class__.__name__, self.id, self.account_owner, self.IBAN)

這是users表中的相關部分:

# Project
class User(UserMixin, Base):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True)
    # etc...
    # Foreign Key payment
    payment_belongs_to_user_addresses = relationship('UserPayData', back_populates="payment_belongs_to_user_relation")

這是我要執行的原始SQL:

CREATE TABLE 'userspaydata'
(
    account_owner TEXT NOT NULL,
    IBAN TEXT NOT NULL,
    belongs_to_user_id INT references users(id)
);

我發現了很多例子,有些例子有所不同。

我有幾個問題:

我還必須創建一個主鍵嗎? AFAIK,如果主鍵未由我定義,它將自動為ID INT

關系不必在數據庫級別定義,它們可以在應用程序級別定義,還是我錯了? 如果我錯了,如何在原始SQL中定義關系?

我尚未提交SQL查詢,語法正確嗎?

我還必須創建一個主鍵嗎

是的,如果要使用sqlalchemy聲明性映射來處理表,通常指定主鍵是一個好主意。

關系不必在數據庫級別定義,它們可以在應用程序級別定義,還是我錯了?

在Sqlalchemy聲明性類中定義的外鍵映射到數據庫外鍵約束。

同樣,關系數據庫中的關系是另一個好主意。 除非有特殊原因,否則請指定外鍵依賴性。

如果未在數據庫中指定約束,則最終可能會導致數據損壞。

如果手動發出DDL語句,則可以指定外鍵約束。 Postgres文檔中的外鍵

我尚未提交SQL查詢,語法正確嗎?

不,這是您的DDL語句的更正版本。

CREATE TABLE userspaydata (
  id INTEGER PRIMARY KEY,
  account_owner TEXT NOT NULL,
  IBAN TEXT NOT NULL,
  belongs_to_user_id INT references users(id) -- this is a FK constraint
);

請注意, id不會自動遞增。 對於auto-increment id

id列定義更改為

-- postgrseql 10 & above
id INTEGER PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY
-- postgresql 9.6 & below
id SERIAL PRIMARY KEY

並將id列的sqlalchemy映射更改為

id = Column(Integer, primary_key=True, auto_increment=True)

這是我的解決方案,它似乎可以工作(我還添加了datetime):

CREATE TABLE userspaydata (
    Id SERIAL primary key,
    account_owner TEXT NOT NULL,
    IBAN TEXT NOT NULL,
    date_added TIMESTAMP WITH TIME ZONE,
    belongs_to_user_id INT references users(id)
);

PK必須由我定義。

關系在應用程序級別上處理。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM