c语言之Linux网络开发

一、网络编程预备知识 socket IP地址 端口号 字节序 (一)socket 是一个编程接口 是一种特殊的文件描述符 (everything in Unix is a file) 并不仅限于TCP/IP协议 面向连接 (Transmission Control Protocol - TCP/IP) 无连接 (User Datagram Protocol -UDP 和 Inter-network Packet Exchange - IPX) (二)socket类型 1、流式套接字(SOCK_STREAM) 提供了一个面向连接、可靠的数据传输服务,数据无差错、无重复的发送且按发送顺序接收。内设置流量控制,避免数据流淹没慢的接收方。数据被看作是字节流,无长度限制。 2、数据报套接字(SOCK_DGRAM) 提供无连接服务。数据包以独立数据包的形式被发送,不提供无差错保证,数据可能丢失或重复,顺序发送,可能乱序接收。 3、原始套接字(SOCK_RAW) 可以对较低层次协议如IP、ICMP直接访问。 (三)socket的位置 (四)IP地址 IP地址是Internet中主机的标识: Internet中的主机要与别的机器通信必须具有一个IP地址 IP地址为32位(IPv4)或者128位(IPv6) 每个数据包都必须携带目的IP地址和源IP地址,路由器依靠此信息为数据包选择路由 表示形式:常用点分形式,如202.38.64.10,最后都会转换为一个32位的无符号整数 (五)端口号 为了区分一台主机接收到的数据包应该转交给哪个进程来进行处理,使用端口号来区别 TCP端口号与UDP端口号独立 端口号一般由IANA (Internet Assigned Numbers Authority) 管理 众所周知端口:1~1023(1~255之间为众所周知端口,256~1023端口通常由UNIX系统占用) 注册端口:1024~49150 动态或私有端口:49151~65535 (六)字节序 不同类型CPU的主机中,内存存储多字节整数序列有两种方法,称为主机字节序(HBO): 小端序(little-endian) - 低序字节存储在低地址 将低字节存储在起始地址,称为“Little-Endi...

FastAPI后端篇之模型表创建、迁移

 一、数据库环境搭建

       首先你需要有一个MySQL数据库,无论是本地的还是远程的都可以,其次我们需要在虚拟环境中安装SQLAlchemy,这是用来创建数据表模型的,具体安装:

pip install sqlalchemy==1.4.18
接着还需要安装pymsql工具,它是用来连接数据库的:
pip install pymysql==1.0.2
这样数据库相关的包已经准备完毕了。

二、数据库模型设计

我们需要使用SQLAlchemy来创建模型表,所以需要依赖于它基本的模型类。
  • 模型基类
在database.py文件中创建基类:
from sqlalchemy.ext.declarative import declarative_base Base = declarative_base()
  • 数据库模型设计
在models.py文件:
from database import Base from sqlalchemy import Column, String, Integer, Float, DateTime, ForeignKey from sqlalchemy.orm import relationship import datetime """ 创建四个模型表: 1、书籍模型表 2、出版社模型表 3、作者模型表 4、出版社于书籍多对多关系模型表 """ class Book(Base): __tablename__ = "book" id = Column(Integer, primary_key=True, index=True) title = Column(String(32)) price = Column(Float) publish_date = Column(DateTime, default=datetime.datetime.now) author_id = Column(Integer, ForeignKey("author.id")) class Author(Base): __tablename__ = "author" id = Column(Integer, primary_key=True, index=True) username = Column(String(32), index=True) email = Column(String(32)) author_to_book = relationship("Book", backref="book_to_author") class Publish(Base): __tablename__ = "publish" id = Column(Integer, primary_key=True, index=True) name = Column(String(32)) publish_to_book = relationship("Book", backref="book_to_publish", secondary="match") class Match(Base): __tablename__ = "match" id = Column(Integer, primary_key=True, index=True) publish_id = Column(Integer, ForeignKey("publish.id")) book_id = Column(Integer, ForeignKey("book.id"))
  • 生成数据表
在database.py文件中创建数据库引擎,连接到数据库(需要先创建好数据库):
from sqlalchemy.engine import create_engine DATABASE_URL = "mysql+pymysql://root:[email protected]:3306/test" engine = create_engine(DATABASE_URL, encoding="utf8", echo=True)
在main.py文件中继续添加如下代码:
from database import engine models.Base.metadata.create_all(bind=engine)
注意这里一定要使用models中的Base基类,因为它已经有你注册的模型表的元数据。


执行main.py文件,此时生成数据表。

三、数据库模型表迁移

(一)Alembic初始化

       虽然上面的可以生成数据库表了,但是后期根据需求还是会随时增加或者减少字段这类的变动,所以需要一个工具来进行迁移文件的管理以及生成对应的数据库模型表,Alembic可以很好的解决这个问题。
  • 安装alembic
pip install alembic==1.6.5
  • 初始化 
在项目的根目录下执行下面的命令进行初始化:
alembic init alembic
此时在项目的根目录下生成alembic文件夹以及alembic.ini配置文件: 

  •  配置 
 在alembic.ini修改数据库的连接配置:
sqlalchemy.url = mysql+pymysql://root:[email protected]:3306/test
  • 在alembic文件夹中的env.py文件中修改target_metadata
import models ... target_metadata = models.Base.metadata ...
(二)使用Alembic
  • 创建数据库迁移文件
将当前数据库的状态生成迁移文件:
alembic revision --autogenerate -m "generate tables"
此时会在alembic目录下的version目录下生成一个新的迁移文件:

  • 迁移文件映射到数据库
这一步是将迁移文件中的动作在数据据中执行,生成对应的表之类的操作:
alembic upgrade head
此时数据表已经成功生成了。


更多文章合集前往: 往期精彩文章

此博客中的热门博文

玩转虚拟机系列之如何搭建虚拟机

玩转虚拟机系列之远程工具

玩转虚拟机系列之如何高效创建虚拟机