如何将 python class 转换为 table postgres

How to convert python class to table postgres

我一直在寻找关于如何从 Python class 在数据库中制作 table 的信息很长时间,但我没有找到很好的解释

我一直在找例子,但是描述有限,例子很难理解

我想不用sqlalchemy等框架实现

class User:
   tablename = "user"
   name = CharField(..)



def create_table(
    sql_query: str, 
    conn: psycopg2.extensions.connection, 
    cur: psycopg2.extensions.cursor
) -> None:
    try:
        # Execute the table creation query
        cur.execute(sql_query)
    except Exception as e:
        print(f"{type(e).__name__}: {e}")
        print(f"Query: {cur.query}")
        conn.rollback()
        cur.close()
    else:
        # To take effect, changes need be committed to the database
        conn.commit()

class 用户 -> postgres table

您将必须连接到数据库并使用 postgresSQL 告诉数据库如何构造 table(s)。只需使 table 属性与您的 class 属性相同即可。

您的 table SQL 将类似于:

 CREATE TABLE [IF NOT EXISTS] table_name (
       class_attribute datatype(length) column_constraint,
       class_attribute datatype(length) column_constraint,
       class_attribute datatype(length) column_constraint,
       table_constraints
    );

如果您想编写自己的 postgresSQL DBMS 接口,您需要对关系数据库有很好的理解。如果您决定要现成的解决方案,请尝试 psycopg

如果你想走这条路,请看一看 attrs:

@attr.s
class C(object):
    x = attr.ib(type=int)
    y = attr.ib(type=str)

flds = attr.fields(C)

flds
(Attribute(name='x', default=NOTHING, validator=None, repr=True, eq=True, order=True, hash=None, init=True, metadata=mappingproxy({}), type=<class 'int'>, converter=None, kw_only=False),
 Attribute(name='y', default=NOTHING, validator=None, repr=True, eq=True, order=True, hash=None, init=True, metadata=mappingproxy({}), type=<class 'str'>, converter=None, kw_only=False))

flds[0].name
'x'
flds[0].type 
int

用于添加元数据,例如table 姓名见 Metadata.

您必须创建一个转换代码,该代码采用 Python 类型并映射到 SQL 类型字符串。

老实说,我的建议是不要使用自己自制的溶液走这条路。有很多 ORM 可以为您完成这项工作,而无需为让您的代码保持最新而头疼。如果你想要更小的东西,那么 SQLAlchemy 看看 peewee

我自己的偏好是使用 Sqitch.

将我的 DDL 保留为 SQL 脚本