[英]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.