公司现在的新方向,将odoo一部分业务剥离出来,单独使用,但数据库还是使用postgres
现在还只是测试,记录一些笔记,方便以后查阅(内容也是网上很多资料的汇总版)
写完了再回顾的时候我就在想,使用Django框架+OdooRPC,会不会更加方便?(如果只能通过事务操作的话)
需要的python库:psycopg2 ; psycopg2-binary
settings文件中,数据库的设置如下:
# Database # https://docs.djangoproject.com/en/3.1/ref/settings/#databases DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql_psycopg2', 'NAME': 'dev', 'USER': 'admin', 'PASSWORD': 'admin', 'HOST': '', #本地 'PORT': '', #默认端口 } }
经过测试,直接走sql语句查询行得通:(记录如下)
from django.db import connection cursor = connection.cursor() cursor.execute('select * from res_users order by id limit 10') users = cursor.fetchall()
但是输出结果不是很乐观,没有深究:
In [8]: users[0] Out[8]: (1, False, '__system__', None, 1, 2, datetime.datetime(2019, 9, 28, 2, 52, 55, 373160), '<span data-o-mail-quote="1">-- <br data-o-mail-quote="1"> System</span>', None, False, None, 1, datetime.datetime(2020, 7, 22, 1, 51, 41, 728112), None, None, 'inbox', 'onboarding_emoji', None, None, None, None, None, None, None, None, None, None, None, None, None, None, 'un_sync')
另一种方法就是通过Django的ORM映射来操作数据库,过程如下:
1. 生成对应的models文件(生成的models文件,与manage.py同级):
python manage.py inspectdb > models.py
2. 欲操作的表,将manage属性设置为True(为True才能通过ORM进行操作):
class Meta: managed = True db_table = 'fr_fund_daily'
3. 执行迁移文件
python manage.py migrate
之后就不知道怎么做了,按道理models文件按照正常的Django操作类,操作数据增删改查,是没有问题的,
但是可能是odoo的表太多,关联字段太多,报错一大片,而且表的数量多的惊人,电脑分分钟卡死,不是很推荐(也可能有什么办法能快速运行吧,但是我还不知道)
最后可能还是要通过事务来操作数据库。
如果你有更好的办法,请务必告诉我,点赞转发投币什么的,下次一定!
写在最后:如果你真的有好的办法进行开发,请联系我,一同交流学习进步,谢谢!
PS:
完美运行!!!
有一天我忽然发现,按照前面的
python manage.py inspectdb > models.py
命令生成了model文件,然后迁移文件的时候,可能会出现很多问题,但是,我今天才反应过来:
运行迁移文件只为了为了同步odoo的postgresql数据库的数据,如果只是为了通过Model映射操作数据库,其实不用运行迁移文件
直接新建一个app,引用model文件,直接操作就可以了;
因为通过模型映射操作数据库,最后也是生成sql语句去查询数据,只要能生成sql语句,就可以了。
emmmmm........
前面的推论,都是我python manager.py shell 尝试的,当我真的运行项目的时候,也报了很多的错23333
这里把我遇到的都记录一下,可能对有幸看到此处的客观有用
- max_length属性问题:自动生成的是-1,但是在Django里面是不允许的,因为odoo数据库已经生成了,所以,改成一个整数其实就可以了,但是为了避免之后遇到Django自带的前面校验问题,我将此属性设置成了1024
- 级联删除问题:自带全是models.DO_NOTHING, 为了避免出现关键字参数和位置参数导致的报错,我将models.DO_NOTHING全局替换成了on_delete=.......
- 反向访问器冲突:Django支持反向查询,如果你不指定,ForeignKey字段,默认的是源模型的小写名称加_set,但是如果odoo设计模型的时候,存在多个字段关联同一个模型,那么默认的反向查询管理器就会同名而导致报错,所以需要自定义一下related_name属性。(这是一个繁琐的过程,你需要把一个模型里面,同时外键关联了同一个模型的字段都设置related_name属性为不同的值